1. 首先感谢倪材@csdn的博客,给了我很大帮助。

http://blog.csdn.net/pjjing/article/details/53186394

http://blog.csdn.net/pjjing/article/details/53187469

这里着重说一下转换中遇到的问题。

首先swig中转换 char *str[] 和char **时会转换成SWIGTYPE_p_p_char类型,这里需要在编写.i文件之前,先编写various.i文件,内容如下

  1. /* -----------------------------------------------------------------------------
  2. * See the LICENSE file for information on copyright, usage and redistribution
  3. * of SWIG, and the README file for authors - http://www.swig.org/release.html.
  4. *
  5. * various.i
  6. *
  7. * SWIG Typemap library for Java.
  8. * Various useful typemaps.
  9. * ----------------------------------------------------------------------------- */
  10.  
  11. /*
  12. * char **STRING_ARRAY typemaps.
  13. * These typemaps are for C String arrays which are NULL terminated.
  14. * char *values[] = { "one", "two", "three", NULL }; // note NULL
  15. * char ** is mapped to a Java String[].
  16. *
  17. * Example usage wrapping:
  18. * %apply char **STRING_ARRAY { char **input };
  19. * char ** foo(char **input);
  20. *
  21. * Java usage:
  22. * String numbers[] = { "one", "two", "three" };
  23. * String[] ret = modulename.foo( numbers };
  24. */
  25. %typemap(jni) char **STRING_ARRAY "jobjectArray"
  26. %typemap(jtype) char **STRING_ARRAY "String[]"
  27. %typemap(jstype) char **STRING_ARRAY "String[]"
  28. %typemap(in) char **STRING_ARRAY (jint size) {
  29. int i = ;
  30. size = JCALL1(GetArrayLength, jenv, $input);
  31. #ifdef __cplusplus
  32. $ = new char*[size+];
  33. #else
  34. $ = (char **)calloc(size+, sizeof(char *));
  35. #endif
  36. for (i = ; i<size; i++) {
  37. jstring j_string = (jstring)JCALL2(GetObjectArrayElement, jenv, $input, i);
  38. const char *c_string = JCALL2(GetStringUTFChars, jenv, j_string, );
  39. #ifdef __cplusplus
  40. $[i] = new char [strlen(c_string)+];
  41. #else
  42. $[i] = (char *)calloc(strlen(c_string)+, sizeof(const char *));
  43. #endif
  44. strcpy($[i], c_string);
  45. JCALL2(ReleaseStringUTFChars, jenv, j_string, c_string);
  46. JCALL1(DeleteLocalRef, jenv, j_string);
  47. }
  48. $[i] = ;
  49. }
  50.  
  51. %typemap(freearg) char **STRING_ARRAY {
  52. int i;
  53. for (i=; i<size$argnum-; i++)
  54. #ifdef __cplusplus
  55. delete[] $[i];
  56. delete[] $;
  57. #else
  58. free($[i]);
  59. free($);
  60. #endif
  61. }
  62.  
  63. %typemap(out) char **STRING_ARRAY {
  64. int i;
  65. int len=;
  66. jstring temp_string;
  67. const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
  68.  
  69. while ($[len]) len++;
  70. jresult = JCALL3(NewObjectArray, jenv, len, clazz, NULL);
  71. /* exception checking omitted */
  72.  
  73. for (i=; i<len; i++) {
  74. temp_string = JCALL1(NewStringUTF, jenv, *result++);
  75. JCALL3(SetObjectArrayElement, jenv, jresult, i, temp_string);
  76. JCALL1(DeleteLocalRef, jenv, temp_string);
  77. }
  78. }
  79.  
  80. %typemap(javain) char **STRING_ARRAY "$javainput"
  81. %typemap(javaout) char **STRING_ARRAY {
  82. return $jnicall;
  83. }
  84.  
  85. /*
  86. * char **STRING_OUT typemaps.
  87. * These are typemaps for returning strings when using a C char ** parameter type.
  88. * The returned string appears in the 1st element of the passed in Java String array.
  89. *
  90. * Example usage wrapping:
  91. * void foo(char **string_out);
  92. *
  93. * Java usage:
  94. * String stringOutArray[] = { "" };
  95. * modulename.foo(stringOutArray);
  96. * System.out.println( stringOutArray[0] );
  97. */
  98. %typemap(jni) char **STRING_OUT "jobjectArray"
  99. %typemap(jtype) char **STRING_OUT "String[]"
  100. %typemap(jstype) char **STRING_OUT "String[]"
  101. %typemap(javain) char **STRING_OUT "$javainput"
  102.  
  103. %typemap(in) char **STRING_OUT($*1_ltype temp) {
  104. if (!$input) {
  105. SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null");
  106. return $null;
  107. }
  108. if (JCALL1(GetArrayLength, jenv, $input) == ) {
  109. SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element");
  110. return $null;
  111. }
  112. $ = &temp;
  113. }
  114.  
  115. %typemap(argout) char **STRING_OUT {
  116. jstring jnewstring = NULL;
  117. if($) {
  118. jnewstring = JCALL1(NewStringUTF, jenv, *$);
  119. }
  120. JCALL3(SetObjectArrayElement, jenv, $input, , jnewstring);
  121. }
  122.  
  123. /*
  124. * char *BYTE typemaps.
  125. * These are input typemaps for mapping a Java byte[] array to a C char array.
  126. * Note that as a Java array is used and thus passeed by reference, the C routine
  127. * can return data to Java via the parameter.
  128. *
  129. * Example usage wrapping:
  130. * void foo(char *array);
  131. *
  132. * Java usage:
  133. * byte b[] = new byte[20];
  134. * modulename.foo(b);
  135. */
  136. %typemap(jni) char *BYTE "jbyteArray"
  137. %typemap(jtype) char *BYTE "byte[]"
  138. %typemap(jstype) char *BYTE "byte[]"
  139. %typemap(in) char *BYTE {
  140. $ = (char *) JCALL2(GetByteArrayElements, jenv, $input, );
  141. }
  142.  
  143. %typemap(argout) char *BYTE {
  144. JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *) $, );
  145. }
  146.  
  147. %typemap(javain) char *BYTE "$javainput"
  148.  
  149. /* Prevent default freearg typemap from being used */
  150. %typemap(freearg) char *BYTE ""

然后将various.i引入自己编写的.i文件:

  1. %module(directors="") thosttradeapi
  2. %include "various.i"
  3. %apply char **STRING_ARRAY { char *ppInstrumentID[] }
  4.  
  5. %{
  6. #include "ThostFtdcTraderApi.h"
  7. #include "ThostFtdcMdApi.h"
  8. %}
  9. %feature("director") CThostFtdcTraderSpi;
  10. %include "ThostFtdcUserApiDataType.h"
  11. %include "ThostFtdcUserApiStruct.h"
  12. %include "ThostFtdcTraderApi.h"
  13. %feature("director") CThostFtdcMdSpi;
  14. %include "ThostFtdcMdApi.h"

中文乱码的问题,按照博客上所述的,需要把thosttraderapi_wrap.cpp中所有的带有中文的方法替换,可以用newStringUTF快速定位,替换完之后make,makefile如下

  1. OBJS=thosttraderapi_wrap.o
  2. INCLUDE=-I./ -I/home/user/jdk/include -I/home/user/jdk/include/linux
  3. TARGET=libthosttraderapi_wrap.so
  4. CPPFLAG=-shared -fPIC
  5. CC=g++
  6. LDLIB=-liconv -L.-Lthosttraderapi
  7. $(TARGET) : $(OBJS)
  8. $(CC) $(CPPFLAG) $(INCLUDE) -o $(TARGET) $(OBJS) $(LDLIB)
  9. $(OBJS) : %.o : %.cpp
  10. $(CC) -c -fPIC $(INCLUDE) $< -o $@
  11. clean:
  12. -rm -f $(OBJS)
  13.    -rm -f $(TARGET)
  14. install:
  15.    cp $(TARGET) /usr/lib

 make之后直接load libthosttradeapi_wrap.so,中文乱码的问题就解决了。

ctp交易平台转java接口转换的更多相关文章

  1. 使用SWIG将C++接口转换成Java接口

    PS:此文章仅作为个人记录使用,代码属于私密,故无法公开: 以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:U ...

  2. OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用OpenCV的示例

    转自:  http://blog.csdn.net/yanzi1225627/article/details/16917961 开发环境:windows+ADT Bundle+CDT+OpenCV-2 ...

  3. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  4. Java 接口和抽象类差别

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...

  5. 我对面向对象设计的理解——Java接口和Java抽象类

    在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...

  6. Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  7. Java 接口和抽象类区别(写的很好,转了)

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...

  8. Java 接口和抽象类--缺省模式

    一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...

  9. 获取Java接口的所有实现类

    获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...

随机推荐

  1. PHP之CI框架第一课

  2. 看懂c/c++ 函数、指针、数组定义

    读懂 函数 + 指针 + 数组 c语言运算符机器优先级,看这里 结合运算符优先级,我们试着读懂函数和指针 优先级简单看 表达式提升():一级优先 函数():二级优先 数组[]:二级优先 指针定义*:三 ...

  3. 第四次作业 四则运算器在C++层面上的进一步思考

    OOA(Object Oriented Analysis,面向对象分析) 从客观存在的事务和事务之间的关系,归纳出有关对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个 ...

  4. 微信小程序view标签以及display:flex的测试

    一:testview.wxml,testview.js自动生成示例代码 //testview.wxml <view class="section"> <view ...

  5. 201521123117 《Java程序设计》第4周学习总结

    1. 本周学习总结 Q1.1 尝试使用思维导图总结有关继承的知识点. Q1.2 使用常规方法总结其他上课内容. 答:控制可见性的4个访问修饰符private -- 仅对本类可见public -- 对所 ...

  6. 201521123093 java 第二周学习总结

    201521123093 <java程序设计> 第二周学习总结 一.第二周学习总结 答:(1)关于进一步使用码云管理代码,本周才真正学会了如何将Eclipse里的代码上传到码云中,并且能够 ...

  7. Java:java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  8. Map.containsKey方法——判断Map集合对象中是否包含指定的键名

    该方法判断Map集合对象中是否包含指定的键名.如果Map集合中包含指定的键名,则返回true,否则返回false. public static void main(String[] args) { M ...

  9. python面向对象之封装

    一.封装 优点:(1)将变化隔离          (2)封装使用         (3)提高复用性        (4)提高安全性 封装原则:(1)将不需要对外提供的内容都隐藏起来         ...

  10. 深入理解计算机系统_3e 第二章家庭作业答案

    初始完成者:哈尔滨工业大学 李秋豪 许可:除2.55对应代码外(如需使用请联系randy.bryant@cs.cmu.edu),任何人可以自由的使用,修改,分发本文档的代码. 本机环境: (有一些需要 ...