前言
本文 介绍 利用Swig工具将CTP C++接口API转换为Java可调用的接口
整合订阅全市场合约traderapi(交易)和订阅全市场合约mdapi(行情)demo
但是由于CTP只提供了对C++版本的API接口 那现在作为java开发就很难受了 ,那我们可不可以将C转为java呢 ,?
当然是可行的,下面就是完整的教程.综合的景大佬的技术支持,
景大佬链接如下:
https://blog.csdn.net/pjjing/article/details/53186394
首先需要的技术支持有:
链接:https://pan.baidu.com/s/1XR3ym5BQgeHxFsCvkP0gJw
提取码:ov63
点击下载。
https://github.com/15200001554/libiconv1
链接:https://pan.baidu.com/s/1I7Wyg9VfLjFOr_pXruHL-Q
提取码:c6lb
首先上海期货信息技术有限公司 下载API
解压缩进入到
在6.3.15_20190220_tradeapi64_se_windows 包下创建几个空的文件夹
目录结构如下:
6.3.15_20190220_tradeapi64_se_windows
│
│─── ctp ─── thostapi
│
│─── demo
│
│─── src
│
│─── wrap
│
│ ThostFtdcMdApi.h
│ ThostFtdcTraderApi.h
│ ThostFtdcUserApiDataType.h
│ …
2.通过Swig得到jar包
在当前文件夹内,新建文件thostapi.i,内容如下
%module(directors="1") thosttraderapi
%include "various.i"
%apply char **STRING_ARRAY { char *ppInstrumentID[] }
%{
#include "ThostFtdcMdApi.h"
#include "ThostFtdcTraderApi.h"
#include "iconv.h"
%}
%typemap(out) char[ANY], char[] {
if ($1) {
iconv_t cd = iconv_open("utf-8", "gb2312");
if (cd != reinterpret_cast(-1)) {
char buf[4096] = {};
char **in = &$1;
char *out = buf;
size_t inlen = strlen($1), outlen = 4096;
if (iconv(cd, in, &inlen, &out, &outlen) != static_cast(-1))
$result = JCALL1(NewStringUTF, jenv, (const char *)buf);
iconv_close(cd);
}
}
}
%feature("director") CThostFtdcMdSpi;
%ignore THOST_FTDC_VTC_BankBankToFuture;
%ignore THOST_FTDC_VTC_BankFutureToBank;
%ignore THOST_FTDC_VTC_FutureBankToFuture;
%ignore THOST_FTDC_VTC_FutureFutureToBank;
%ignore THOST_FTDC_FTC_BankLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BrokerLaunchBankToBroker;
%ignore THOST_FTDC_FTC_BankLaunchBrokerToBank;
%ignore THOST_FTDC_FTC_BrokerLaunchBrokerToBank;
%include "ThostFtdcUserApiDataType.h"
%include "ThostFtdcUserApiStruct.h"
%include "ThostFtdcMdApi.h"
%feature("director") CThostFtdcTraderSpi;
%include "ThostFtdcTraderApi.h"
various.i文件是swig自带的,将swig/Lib/java/various.i拷贝过来即可。
/* -----------------------------------------------------------------------------
* 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 = 0;
if ($input) {
size = JCALL1(GetArrayLength, jenv, $input);
#ifdef __cplusplus
$1 = new char*[size+1];
#else
$1 = (char **)calloc(size+1, sizeof(char *));
#endif
for (i = 0; i
然后再当前目录cmd下运行命令:
swig.exe -c++ -java -package ctp.thostapi -outdir src -o thosttraderapi_wrap.cpp thostapi.i
当前目录下生成了:这两个文件是用于包装原来C++接口的文件
thosttraderapi_wrap.h
thosttraderapi_wrap.cpp
打开src文件夹,可以看到这时在里面生成了一系列方法的java文件,如下
CThostFtdcAccountregisterField.java
CThostFtdcAuthenticationInfoField.java
… … …
thosttradeapiJNI.java
在cmd中cd到src文件夹底下,运行命令
javac *.java
运行结束之后可以看到生成了等量的class文件,将所有的class文件拷贝到\ctp\thostapi\文件夹中,cmd下cd到6.3.15_20190220_tradeapi64_se_windows目录下,运行命令.即可在当前文件夹下得到了jar包thostapi.jar。
jar cf thostapi.jar ctp
. 通过C++得到java可调用的dll动态库
接下来在wrap文件夹中,建立一个C++工程,工程为Win32控制台应用程序,工程名为thostapi_wrap,点下一步,工程的应用程序类型选DLL,附加选项选空项目。另外建好项目后,在工程属性-c/c+±代码生成-运行库中选多线程(/MT)。步骤图如下:
完成之后,将如下文件拷贝到\wrap\thostapi_wrap文件夹下
ThostFtdcMdApi.h
ThostFtdcTraderApi.h
ThostFtdcUserApiDataType.h
ThostFtdcUserApiStruct.h
thostmduserapi_se.lib
thosttraderapi_se.lib
thosttraderapi_wrap.cpp
thosttraderapi_wrap.h
libiconv.lib
iconv.h
其中
libiconv.lib 和iconv.h 在github下载的包里找
在thostapi_wrap.cpp 文件任意位置添加
#pragma comment(lib,"libiconv.lib")
在c++工程中添加现有项,将这些文件全部添加到工程中去。下面还要做几步:
将你安装jdk目录\Java\jdk1.8.0_111\include下的jni.h和win32文件夹下的jni_md.h, jawt_md.h一共三个文件拷贝到安装vs的include目录底下\Microsoft Visual Studio 12.0\VC\include。这是因为thosttraderapi_wrap.cpp文件中包含了
!
这所有完成之后,C++工程中文件应该如下:
然后选择release版编译。我们按F7编译,在\wrap\thosttraderapi_wrap\Release目录底下可见thosttraderapi_wrap.dll动态库文件,说明编译成功,这样CTP Java API就编译成功了。编译中如果出现error LNK2005: abort 已经在 LIBCMT.lib(abort.obj) 中定义…等错误,可以右击工程 - 属性 ”配置属性 - 链接器 - 命令行” 添加: /NODEFAULTLIB:"libcmt.lib"解决。