注:本篇以易盛9.3.3.3版本为例,window10 操作系统64位(默认系统已经安装jdk环境)
- 准备工作
从易盛官网(易盛9.0API)上下载易盛 API点击下载。
1.1. 安装swig
安装Swig软件,本文中所用的Swig是swigwin-4.0.0版本,并且将swig加入环境变量
- 通过swig生成java文件
2.1. 新建工作目录
我这里是: C:\Users\source\new_esunny\iTapTradeApi33.1_Win64_10384 (最好目录不要出现中文)
2.2.新建三个子文件夹
在iTapTradeApi33.1_Win64_10384 下新建三个子文件夹,分别是esunny、src、wrap
2.3. 易盛9.0api解压
将这几个文件以及iTapTradeAPI_64.dll、iTapTradeAPI_64.dll.lib 放入"iTapTradeApi33.1_Win64_10384 "文件夹下,如下图所示:
2.4. 新建文件esunnytrade.i,并将下面内容填充到该文件中.
这是一个接口文件,用于告诉swig为哪些类和方法创建接口
%module(directors="1") esunnytrade
%{
#include "iTapAPICommDef.h"
#include "iTapTradeAPIDataType.h"
#include "iTapAPIError.h"
#include "iTapTradeAPI.h"
#include
#include
#include
#include
using namespace std;
#ifdef _MSC_VER
const static locale g_loc("zh-CN");
#else
const static locale g_loc("zh_CN.GB18030");
#endif
%}
///解决中文乱码问题
%typemap(out) char[ANY], char[] {
const std::string &gb2312($1);
std::vector<wchar_t> wstr(gb2312.size());
wchar_t* wstrEnd = nullptr;
const char* gbEnd = nullptr;
mbstate_t state = {};
int res = use_facet<codecvt<wchar_t, char, mbstate_t> >
(g_loc).in(state,
gb2312.data(), gb2312.data() + gb2312.size(), gbEnd,
wstr.data(), wstr.data() + wstr.size(), wstrEnd);
if (codecvt_base::ok == res)
{
wstring_convert<codecvt_utf8<wchar_t>> cutf8;
std::string result = cutf8.to_bytes(wstring(wstr.data(), wstrEnd));
$result=JCALL1(NewStringUTF,jenv,result.c_str());
}
else
{
std::string result;
$result=JCALL1(NewStringUTF,jenv,result.c_str());
}
}
%feature("director") ITapTradeAPINotify;
%include "carrays.i"
%include "arrays_java.i"
%include "cpointer.i"
%include "typemaps.i"
//类型转化
%apply int & INOUT { ITapTrade::TAPIUINT32 *sessionID};
//对char特殊处理 替换char字符串为 byte[] 类型 因为c++会通过指针操作字节数组 不能操作char
%apply signed char *INOUT { ITapTrade::TAPISTR_50 * };
//接口重载
%apply int & INOUT { int & iResult };
//引入h文件
%include "iTapAPICommDef.h"
%include "iTapTradeAPIDataType.h"
%include "iTapAPIError.h"
%include "iTapTradeAPI.h"
2.5. 生成java文件
窗口切入iTapTradeApi33.1_Win64_10384 目录下,打开cmd,执行下面的语句(如果报没有swig这个命令,那就是你的环境变量没配好)
swig -c++ -java -package esunny.esunnytrade -outdir src -o esunnytrade_wrap.cpp esunnytrade.i
命令解释:
-c++ 转c++
-java 转为目标语言
-package java文件所在的package
-outdir 输出到某个文件夹
-o 输出的cpp_wrap文件(如果不写生成的文件默认为.cxx文件)
执行成功之后src目录下会有java文件,紧接着在src目录下打开一个新的cmd窗口,并执行 javac *.java,这一步的目的是编译java代码,会生成对应的.class文件
将class文件移入到 iTapTradeApi33.1_Win64_10384/esunny/esunnytrade下
到这里就已经完成了第一步了
-
生成jar包
在iTapTradeApi33.1_Win64_10384目录下打开cmd,执行 jar cf esunnytrade.jar esunny生成jar包 -
生成dll动态库
在iTapTradeApi33.1_Win64_10384/wrap文件夹下建立一个C++工程,工程的应用程序类型选DLL,工程名为esunnytrade_wrap(建工程的步骤也可参考 新建project )
需要注意几点
工程建64位dll类型,
运行库选多线程(/MT)
然后将如下文件拷贝到esunnytrade_wrap\esunnytrade_wrap\文件夹下:
在c++工程中添加现有项,将这些文件全部添加到工程中去。下面还要做几步:
将你安装的java下include文件夹的路径添加至C++附加包含目录。我的路径是E:\develop\jdk1.8.0_25\include;E:\develop\jdk1.8.0_25\include\win32;,
2. 将你安装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。
3. 这是因为esunnytrade_wrap.cpp文件中包含了<jni.h>,这是用于生成Java可调用接口的库文件。
然后在下图选择 Release、x64,进行编译,然后控制台会输出
1>------ 已启动生成: 项目: esunnytrade_wrap, 配置: Release x64 ------
1>esunnytrade_wrap.vcxproj -> C:\Users\xxxx\source\new_esunny\iTapTradeApi33.1_Win64_10384\wrap\esunnytrade_wrap\x64\Release\esunnytrade_wrap.dll
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
- 整合java项目
实例代码如下附件:
到这里,就已经完成c++对java的转化了,后面不清楚的同学也可以补充~
附件:
swig转java接口.zip
esunnytrade.i
参考:
Swig4.0接口文档
swig环境变量问题汇总
CTP JAVA API(JCTP)编译(利用Swig封装C++动态库)windows版
易盛9.3.3.3 API
易盛交易接口使用swig c++转c# Version9.1
对接国内期货CTP交易系统(参考)