gpt4 book ai didi

java - JNA:EXCEPTION_ACCESS_VIOLATION

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:10 29 4
gpt4 key购买 nike

我正在通过 JNA 使用 C++ DLL。我想在Java中调用下面的方法,将我想读取的信息写入szVisor。

long FAR PASCAL DLL_GetLocalPortTS(char* szEquip,char* szVisor){
...
}

Java接口(interface)实现如下:

public interface IE2E extends Library {
// Instancia de la dll, carga la librería
IE2E INSTANCE = (IE2E) Native.loadLibrary("e2e", IE2E.class);
...
int GetLocalPortTS(String equip, String[] equipInfo);
}

方法调用:

String equip = "equipID";
String equipInfo = "";
String[] rEquipInfo = {equipInfo};
IE2E sdll = IE2E.INSTANCE;

int ret = sdll.GetLocalPortTS(equip, rEquipInfo);

此执行在 JRE 中给我带来了 fatal error ,但如果我将两个参数都作为 String 或 String[] 则不会。但是,如果我同时使用这两个字符串,它不会覆盖 equipInfo 并且我得不到我想要的信息;如果我将两者都用作数组,则该方法不会获取装备值并且不会运行。

欢迎任何对此的见解。

最佳答案

问题是C代码要写入szVisor,对吧?我猜它会做这样的事情:

long GetLocalPortTS(char* szEquip,char* szVisor){
strcpy(szVisor, "I am C code result :)");
return 0;
}

如果您从 Java 端传入一个字符串,那么内存归 JVM 所有,因此写入它会导致崩溃。你需要的是 Memory对象,它是 C 代码可以安全写入的包装的 malloc 内存位。

您的新 JNA 界面如下所示。我已经注释掉了旧版本,所以你可以比较:

public interface IE2E extends Library {
IE2E INSTANCE = (IE2E) Native.loadLibrary("e2e", IE2E.class);
//int GetLocalPortTS(String equip, String[] equipInfo);
int GetLocalPortTS(String equip, Memory equipInfo);
}

调用它的代码如下,256 是一个占位符。确保分配足够的空间来将字符串写入:

String equip = "equipID";
String equipInfo = "";
//String[] rEquipInfo = {equipInfo};
Memory rEquipInfo = new Memory(256);
IE2E sdll = IE2E.INSTANCE;
int ret = sdll.GetLocalPortTS(equip, rEquipInfo);

要将结果用作字符串,您可以这样做:

rEquipInfo.getString(0);

如文档所述,Memory 的 finalize() 方法会自动调用 malloc 内存上的 free,因此无需担心内存泄漏。

关于java - JNA:EXCEPTION_ACCESS_VIOLATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538130/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com