一、前言

在量化交易交易开发中,CTP 接口是最常用的 C++ 行情 / 交易 API。但很多项目使用 Java 开发,需要 Java 直接调用 CTP C++ 接口。

Swig用来包装已有的 C/C++ 代码并生成目标语言(Java、Python等)代码。

Visual Studio Community 2022(以下简称VS 2022)是面向 .NET 和 C++ 开发人员的综合性 Windows 版 IDE,可用于构建 Web、云、桌面、移动应用、服务和游戏,完全免费供用户使用。

传统手写 JNI 代码繁琐、易崩溃、维护成本高。SWIG + VS 2022 可以自动生成 JNI 代码,一键把 CTP接口转换成 Java 接口,Java 直接调用。

本文主要实现行情接口(Market Data API)的转化过程,交易接口(Trader API)的转化过程相似。

二、环境准备

(一)操作系统

Windows 10/11

(二)JDK

jdk-21_windows-x64

(三)VS 2022

其他安装过程省略,以下过程务必选择“使用C++的桌面开发”

(四)SWIG

1.压缩包下载

打开https://www.swig.org,下载swig4.3.0版本压缩包,压缩解压后目录内容如下:

2.环境变量设置

右键点击我的电脑->属性->高级系统设置->高级->环境变量

点击高级-环境变量,打开环境变量窗口,如图:

在系统变量中选择变量Path,点击编辑按钮,打开环境变量编辑窗口,如图:

点击新建,输入swig解压缩后的地址,点击确定。

3.验证安装

按win+r打开窗口 ,输入“cmd”点击确定,打开“命令行”窗口,输入“swig -version”命令,点击回车,显示如图所示,代表配置成功:

(五)CTP接口下载

打开https://www.simnow.com.cn,,点击”API下载“,根据具体开发情况选择,此处选择PC端的6.7.2版本。下载后解压,解压后文件清单如图(根据选择环境进行选择32位还是64位,此处选择64位版本)

三、SWIG 封装 Java 代码

在刚刚解压的CTP文件夹内(例如20230913_traderapi64_se_windows),新建文件_thostmduserapi.i文件(文件名可以自定义,后缀不能变,文件内容见附录),这是一个接口文件,用于告诉swig为哪些类和方法创建接口,然后在当前目录内建立文件夹srcmd(此文件夹用于存储转换后生成的java文件);

在swig安装目录中找到various.i(如: F:\Tools\swigwin-4.3.0\Lib\java),拷贝到刚刚解压的CTP文件夹内;

按win+r打开窗口 ,输入“cmd”点击确定,打开“命令行”窗口,切换到当前目录\20230913_traderapi64_se_windows下。 在命令行运行命令

swig.exe -c++ -java -package com.ctp.thostmduserapi -outdir srcmd -o thostmduserapi_wrap.cpp _thostmduserapi.i

参数说明:

-java:指生成java接口

-package:是指定包位置

-outdir:是指定输出java代码位置

-o:是生成的cpp和h的文件名称

这运行可能要持续1分钟,等到运行完成后,可以看到当前目录下生成了

这两个文件是根据_thostmduserapi翻译过来的,是用于包装原来C++接口的文件。打开srcmd文件夹,可以看到这时在里面生成了一系列方法的java文件,如下:

四、VS 2022 编译 DLL

(一)创建项目

启动Visual Studio Community 2022,选择“创建新项目”(例如thostmduserapi),如图:

选择“动态链接库(DLL),点击下一步。如图:

输入项目名称,选择位置,如图。

点击创建,创建的项目结构如图,

建好项目后,活动选”Release“,平台选”x64“

(二)项目配置

在工程属性C/C++-代码生成-运行库中选多线程(/MT)。

在工程属性C/C+±代码生成-预编译头-预编译头中选择”不使用预编译头“。

复制以下文件到将如下文件拷贝到C++工程thostmduserapi文件夹下:

ThostFtdcMdApi.h

ThostFtdcUserApiDataType.h

ThostFtdcUserApiStruct.h

thostmduserapi_se.lib

thostmduserapi_wrap.cpp

thostmduserapi_wrap.h

在工程中添加-现有项,将这些文件全部添加到工程中去。

打开项目的属性,定位到“配置属性” – “VC++目录”,“包含目录”加上 JDK 的include和win32\include目录。这是因为thostmduserapi_wrap.cpp文件中包含了<jni.h>,这是用于生成Java可调用接口的库文件。

(也可以将你安装jdk目录include下的jni.h和include\win32文件夹下的jni_md.h, jawt_md.h一共三个文件拷贝到安装VS 2022的include目录底下,例如C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include)

(三)生成代码

点击生成-生成解决方案,等待输出

输出控制提示成功。在<工程名称>\x64\Releas目录底下可见生成的thostmduserapi.dll动态库文件(动态库名称和工程名称有关系),说明编译成功。这样CTP Java API就编译成功了。将生成的thostmduserapi.dll和之前的thostmduserapi_se.dll及srcmd包内文件拷贝到Java项目就可以用了。

五、附录

_thostmduserapi.i文件内容

%module(directors="1") thostmduserapi
%include "various.i"
%apply char **STRING_ARRAY { char *ppInstrumentID[] }
%{ 
#include "ThostFtdcMdApi.h"
#include <codecvt>
#include <locale>
#include <vector>
#include <string>
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") 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"

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐