我在我的项目中使用JNA,在某些情况下,我的Java JNA Callbacks抛出异常。我想从C / C ++代码中了解到上次calbback方法调用引发的异常。在JNI中,可以使用env-> ExceptionCheck()来完成它,但在JNA中找不到任何等价物。
有可能实现这个目标吗?
答案 0 :(得分:0)
调用回调的本机代码当然不会期望引发Java异常。无法保证从包含JVM上下文调用JNA回调。即使是这样,你也必须建立一个带外通道,将异常从回调传递到堆栈中的JVM,因为你无法保证调用C代码。
假设你有Java代码 - > C代码 - >回调,我建议您捕获所有回调的异常,然后将它们放在某处,以便在调用后检查调用Java代码。
你可以使用InvocationMapper
来实现这一点,这基本上可以让你捕获和/或修改接口映射调用的结果,但它可能更容易明白它将整个事物包裹在效用函数中。
例如:
public interface MyLibrary extends Library {
MyLibrary INSTANCE = (MyLibrary)Native.loadLibrary();
interface MyCallback extends Callback {
void invoke();
}
void myFunction(MyCallback callback);
}
然后你提供了一个实用程序包装器:
public void myFunction(final MyCallback callback) {
final List<Exception> exceptions = new List<Exception>();
MyLibrary.INSTANCE.myFunction(new MyCallback() {
public void invoke() {
try {
callback.invoke();
} catch(Exception e) {
exceptions.add(e);
}
}
});
if (exceptions.size() > 0) {
// ...
}
}