java ctp 接口_期货 CTP的JAVA接口 JNI实现

用JNI直接实现CTP API

这里记录一下思路,做个纪念。防止以后忘记了~~

参考了SWIG的一些做法(就是照抄了基本思路),例如director类(SPI往回调用),比如methodID的数组。

但是也有很多不一样的地方(偷懒的),例如C++的SPI的OnXXX函数回调Java方法时,考虑子类继承时,SWIG会做很多判断,本文忽略了很多细节。

还例如SWIG所有的CTP数据结构都使用C++原生的,然后java中通过native的setter和getter来操作,本文的数据结构都是纯java对象。

编译连接生成了Windows和linux(Ubuntu)的64位的接口,放在了一个jar中

CTP的头文件分为3个部分:

1. ThostFtdcUserApiDataType.h,api的数据类型, typedef了一大堆类型,char, char[], int, short, double。 对于大部分char型,又#define了很多字符常量。开头的枚举类型比较特殊。还有那个单引号括起来的连续字符也比较特殊。

2. ThostFtdcUserApiStruct.h, api的数据结构,用于api和spi的函数参数。数据结构的成员变量的类型全部来自上面的头文件

3.  API、SPI (Trader, Market Data)

思路:

Java的API类跟C++中一样,只能通过静态方法例如CreateFtdcTraderApi方法来创建。

Java的API类,包含一个C++的API的实例的指针。API的每个函数,全部通过native方法。这个native方法通过这个指针调用对应的CTP API。例如:

public native int ReqUserLogin(CThostFtdcReqUserLoginField pReqUserLoginField,int nRequestID);

Java中的SPI类可以用new来创建,它的构造函数会调用newNativeSpiInstance这个native方法。newNativeSpiInstance(代码最长的函数)会干这么几件事:

获得Java的SPI实例的全局引用;

获得java线程的JVM指针(因为JNIEnv指针只有当前线程有效,SPI的OnXXX是新线程,这个指针会失效)

以Java的SPI实例的全局引用和JVM指针作为参数,创建一个C++中的SPI子类

Java中的SPI类中的OnXXX函数,则是通过CTP的SPI实例的OnXXX函数直接调用。例如:

voidOnFrontConnected()

{ </

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值