jna调用传字符串,出现偶尔的传值错误问题

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>
阅读 3.8k
1 个回答

const char* 不需要使用Pointer, 直接用java 的String,淦

方法修改后:

int IC_Open(String pszAddress, String pszUsername, String pszPassword, String pszEpid, Pointer hSession);

连续调用30次没有出现过错误

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题