Swig C++接口转java指南(Windows)

Scroll Down

注:本篇以易盛9.3.3.3版本为例,window10 操作系统64位(默认系统已经安装jdk环境)

  1. 准备工作
    从易盛官网(易盛9.0API)上下载易盛 API点击下载。

1.1. 安装swig
安装Swig软件,本文中所用的Swig是swigwin-4.0.0版本,并且将swig加入环境变量

  1. 通过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 "文件夹下,如下图所示:

1.png
2.png

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下
3.png

4.png

到这里就已经完成了第一步了

  1. 生成jar包
    在iTapTradeApi33.1_Win64_10384目录下打开cmd,执行 jar cf esunnytrade.jar esunny生成jar包

  2. 生成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 个 ==========

5.png

6.png

7.png

  1. 整合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交易系统(参考)