ctp交易平台转java接口转换
- 首先感谢倪材@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文件,内容如下
- /* -----------------------------------------------------------------------------
- * See the LICENSE file for information on copyright, usage and redistribution
- * of SWIG, and the README file for authors - http://www.swig.org/release.html.
- *
- * various.i
- *
- * SWIG Typemap library for Java.
- * Various useful typemaps.
- * ----------------------------------------------------------------------------- */
- /*
- * char **STRING_ARRAY typemaps.
- * These typemaps are for C String arrays which are NULL terminated.
- * char *values[] = { "one", "two", "three", NULL }; // note NULL
- * char ** is mapped to a Java String[].
- *
- * Example usage wrapping:
- * %apply char **STRING_ARRAY { char **input };
- * char ** foo(char **input);
- *
- * Java usage:
- * String numbers[] = { "one", "two", "three" };
- * String[] ret = modulename.foo( numbers };
- */
- %typemap(jni) char **STRING_ARRAY "jobjectArray"
- %typemap(jtype) char **STRING_ARRAY "String[]"
- %typemap(jstype) char **STRING_ARRAY "String[]"
- %typemap(in) char **STRING_ARRAY (jint size) {
- int i = ;
- size = JCALL1(GetArrayLength, jenv, $input);
- #ifdef __cplusplus
- $ = new char*[size+];
- #else
- $ = (char **)calloc(size+, sizeof(char *));
- #endif
- for (i = ; i<size; i++) {
- jstring j_string = (jstring)JCALL2(GetObjectArrayElement, jenv, $input, i);
- const char *c_string = JCALL2(GetStringUTFChars, jenv, j_string, );
- #ifdef __cplusplus
- $[i] = new char [strlen(c_string)+];
- #else
- $[i] = (char *)calloc(strlen(c_string)+, sizeof(const char *));
- #endif
- strcpy($[i], c_string);
- JCALL2(ReleaseStringUTFChars, jenv, j_string, c_string);
- JCALL1(DeleteLocalRef, jenv, j_string);
- }
- $[i] = ;
- }
- %typemap(freearg) char **STRING_ARRAY {
- int i;
- for (i=; i<size$argnum-; i++)
- #ifdef __cplusplus
- delete[] $[i];
- delete[] $;
- #else
- free($[i]);
- free($);
- #endif
- }
- %typemap(out) char **STRING_ARRAY {
- int i;
- int len=;
- jstring temp_string;
- const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
- while ($[len]) len++;
- jresult = JCALL3(NewObjectArray, jenv, len, clazz, NULL);
- /* exception checking omitted */
- for (i=; i<len; i++) {
- temp_string = JCALL1(NewStringUTF, jenv, *result++);
- JCALL3(SetObjectArrayElement, jenv, jresult, i, temp_string);
- JCALL1(DeleteLocalRef, jenv, temp_string);
- }
- }
- %typemap(javain) char **STRING_ARRAY "$javainput"
- %typemap(javaout) char **STRING_ARRAY {
- return $jnicall;
- }
- /*
- * char **STRING_OUT typemaps.
- * These are typemaps for returning strings when using a C char ** parameter type.
- * The returned string appears in the 1st element of the passed in Java String array.
- *
- * Example usage wrapping:
- * void foo(char **string_out);
- *
- * Java usage:
- * String stringOutArray[] = { "" };
- * modulename.foo(stringOutArray);
- * System.out.println( stringOutArray[0] );
- */
- %typemap(jni) char **STRING_OUT "jobjectArray"
- %typemap(jtype) char **STRING_OUT "String[]"
- %typemap(jstype) char **STRING_OUT "String[]"
- %typemap(javain) char **STRING_OUT "$javainput"
- %typemap(in) char **STRING_OUT($*1_ltype temp) {
- if (!$input) {
- SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null");
- return $null;
- }
- if (JCALL1(GetArrayLength, jenv, $input) == ) {
- SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element");
- return $null;
- }
- $ = &temp;
- }
- %typemap(argout) char **STRING_OUT {
- jstring jnewstring = NULL;
- if($) {
- jnewstring = JCALL1(NewStringUTF, jenv, *$);
- }
- JCALL3(SetObjectArrayElement, jenv, $input, , jnewstring);
- }
- /*
- * char *BYTE typemaps.
- * These are input typemaps for mapping a Java byte[] array to a C char array.
- * Note that as a Java array is used and thus passeed by reference, the C routine
- * can return data to Java via the parameter.
- *
- * Example usage wrapping:
- * void foo(char *array);
- *
- * Java usage:
- * byte b[] = new byte[20];
- * modulename.foo(b);
- */
- %typemap(jni) char *BYTE "jbyteArray"
- %typemap(jtype) char *BYTE "byte[]"
- %typemap(jstype) char *BYTE "byte[]"
- %typemap(in) char *BYTE {
- $ = (char *) JCALL2(GetByteArrayElements, jenv, $input, );
- }
- %typemap(argout) char *BYTE {
- JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *) $, );
- }
- %typemap(javain) char *BYTE "$javainput"
- /* Prevent default freearg typemap from being used */
- %typemap(freearg) char *BYTE ""
然后将various.i引入自己编写的.i文件:
- %module(directors="") thosttradeapi
- %include "various.i"
- %apply char **STRING_ARRAY { char *ppInstrumentID[] }
- %{
- #include "ThostFtdcTraderApi.h"
- #include "ThostFtdcMdApi.h"
- %}
- %feature("director") CThostFtdcTraderSpi;
- %include "ThostFtdcUserApiDataType.h"
- %include "ThostFtdcUserApiStruct.h"
- %include "ThostFtdcTraderApi.h"
- %feature("director") CThostFtdcMdSpi;
- %include "ThostFtdcMdApi.h"
中文乱码的问题,按照博客上所述的,需要把thosttraderapi_wrap.cpp中所有的带有中文的方法替换,可以用newStringUTF快速定位,替换完之后make,makefile如下
- OBJS=thosttraderapi_wrap.o
- INCLUDE=-I./ -I/home/user/jdk/include -I/home/user/jdk/include/linux
- TARGET=libthosttraderapi_wrap.so
- CPPFLAG=-shared -fPIC
- CC=g++
- LDLIB=-liconv -L.-Lthosttraderapi
- $(TARGET) : $(OBJS)
- $(CC) $(CPPFLAG) $(INCLUDE) -o $(TARGET) $(OBJS) $(LDLIB)
- $(OBJS) : %.o : %.cpp
- $(CC) -c -fPIC $(INCLUDE) $< -o $@
- clean:
- -rm -f $(OBJS)
- -rm -f $(TARGET)
- install:
- cp $(TARGET) /usr/lib
make之后直接load libthosttradeapi_wrap.so,中文乱码的问题就解决了。
ctp交易平台转java接口转换的更多相关文章
- 使用SWIG将C++接口转换成Java接口
PS:此文章仅作为个人记录使用,代码属于私密,故无法公开: 以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:U ...
- OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用OpenCV的示例
转自: http://blog.csdn.net/yanzi1225627/article/details/16917961 开发环境:windows+ADT Bundle+CDT+OpenCV-2 ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Java 接口和抽象类差别
原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...
- 我对面向对象设计的理解——Java接口和Java抽象类
在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...
- Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- Java 接口和抽象类区别(写的很好,转了)
原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...
- Java 接口和抽象类--缺省模式
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...
- 获取Java接口的所有实现类
获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...
随机推荐
- PHP之CI框架第一课
- 看懂c/c++ 函数、指针、数组定义
读懂 函数 + 指针 + 数组 c语言运算符机器优先级,看这里 结合运算符优先级,我们试着读懂函数和指针 优先级简单看 表达式提升():一级优先 函数():二级优先 数组[]:二级优先 指针定义*:三 ...
- 第四次作业 四则运算器在C++层面上的进一步思考
OOA(Object Oriented Analysis,面向对象分析) 从客观存在的事务和事务之间的关系,归纳出有关对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个 ...
- 微信小程序view标签以及display:flex的测试
一:testview.wxml,testview.js自动生成示例代码 //testview.wxml <view class="section"> <view ...
- 201521123117 《Java程序设计》第4周学习总结
1. 本周学习总结 Q1.1 尝试使用思维导图总结有关继承的知识点. Q1.2 使用常规方法总结其他上课内容. 答:控制可见性的4个访问修饰符private -- 仅对本类可见public -- 对所 ...
- 201521123093 java 第二周学习总结
201521123093 <java程序设计> 第二周学习总结 一.第二周学习总结 答:(1)关于进一步使用码云管理代码,本周才真正学会了如何将Eclipse里的代码上传到码云中,并且能够 ...
- Java:java中BufferedReader的read()及readLine()方法的使用心得
BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...
- Map.containsKey方法——判断Map集合对象中是否包含指定的键名
该方法判断Map集合对象中是否包含指定的键名.如果Map集合中包含指定的键名,则返回true,否则返回false. public static void main(String[] args) { M ...
- python面向对象之封装
一.封装 优点:(1)将变化隔离 (2)封装使用 (3)提高复用性 (4)提高安全性 封装原则:(1)将不需要对外提供的内容都隐藏起来 ...
- 深入理解计算机系统_3e 第二章家庭作业答案
初始完成者:哈尔滨工业大学 李秋豪 许可:除2.55对应代码外(如需使用请联系randy.bryant@cs.cmu.edu),任何人可以自由的使用,修改,分发本文档的代码. 本机环境: (有一些需要 ...