c++方法定义
函数:int IC_Open (IN const char* pszAddress, IN const char* pszUsername, IN const char* pszPassword, IN const char* pszEpid, OUT IC_HANDLE *hSession)
参数:const char* pszAddress [in] 目标平台的地址(格式为 “ip:port”);
const char* pszUsername [in] 登录用户名;
const char* pszPassword [in] 登录密码;
const char* pszEpid [in] 企业ID;
IC_HANDLE *hSession[out] 连接成功后返回连接索引
其中的IC_HANDLE类型定义
typedef void* IC_HANDLE; /* 句柄 */
我用JNA写的方法
int IC_Open(Pointer pszAddress, Pointer pszUsername, Pointer pszPassword, Pointer pszEpid, Pointer hSession);
字符串参数构建,我是转bytes(sdk方说字符传编码gb2312),再构建的Pointer
public static Pointer buildStrPointer(String str) {
byte[] bytes = new byte[0];
try {
bytes = str.getBytes(charset);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Pointer pointer = new Memory(bytes.length);
pointer.write(0, bytes, 0, bytes.length);
return pointer;
}
我的调用代码
IntByReference sessionRef = new IntByReference();
int res = sdk.IC_Open(
buildStrPointer("localhost:9988"),
buildStrPointer("admin"),
buildStrPointer("password"),
buildStrPointer("system"),
sessionRef.getPointer()
);
出现的问题
奇葩的是,有时成功有时失败,我测试20次,有15次正常,5次失败(后面多次测试,大概都是这个比例)
5次失败时,看c++那边打印收到的值,是不正确的,
如:
admingra?i彿l-. system�u_�. adminva\.. system.
在原本的 admin、system后面出现了乱码,像是取值位置错误似的
困扰我很久了,不知道怎么解决
补充:使用的JNA依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.8.0</version>
</dependency>
const char* 不需要使用Pointer, 直接用java 的String,淦
方法修改后:
连续调用30次没有出现过错误