gpt4 book ai didi

java - JNA - 访问冲突,JVM 终止

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:58:48 25 4
gpt4 key购买 nike

我正在通过向其传递回调函数对象来调用 DLL。其中一项功能是简单打印。然后,我有一个 100 次迭代的循环,只打印索引和循环后的一些打印。


这是C代码

extern "C" int Start(void* callback(CString))
{
for(int j=0; j<100; j++)
callback(AConvertToString(j));

callback("in Start called from Java");
callback("another line");
}

这是Java代码

public interface MyDll extends Library{
MyDll INSTANCE = (MyDll) Native.loadLibrary("MyDll",MyDll.class);
public interface MyCallback extends StdCallCallback {
public boolean callback(String msg);
}
public int Start(MyCallback callback);
}

//in main:
...
MyDll myDll = (MyDll)MyDll.INSTANCE;
myDll.Start(new MyDll.MyCallback() {
public boolean callback(String msg) {
System.out.println(msg);
return true;
}
});

输出是数字 0..41(是 41!!!不是 99)然后“在从 Java 调用的 Start 中”接着是可怕的崩溃:

#
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c809823, pid=468, tid=2636
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b23 mixed mode, sharing windows-x86)
# Problematic frame:
# C [kernel32.dll+0x9823]

我已经阅读了很多(这里也是),但我找不到问题所在。我正在运行 Java6 的 JRE。我的机器上有 1.5GB 的内存。 DLL 未被任何其他进程使用(没有并发问题)。

谢谢,阿兹丽尔

最佳答案

尝试将 MyCallback 编写为 com.sun.jna.Callback 而不是 com.sun.jna.win32.StdCallLibrary.StdCallCallback :

public interface MyDll extends Library{
MyDll INSTANCE = (MyDll) Native.loadLibrary("MyDll",MyDll.class);
public interface MyCallback extends Callback {
public boolean callback(String msg);
}
public int Start(MyCallback callback);
}

问候,伊曼纽尔·吉拉德

关于java - JNA - 访问冲突,JVM 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1213015/

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