env-> JNA中的ExceptionCheck()

时间:2015-06-30 11:57:46

标签: jna

我在我的项目中使用JNA,在某些情况下,我的Java JNA Callbacks抛出异常。我想从C / C ++代码中了解到上次calbback方法调用引发的异常。在JNI中,可以使用env-> ExceptionCheck()来完成它,但在JNA中找不到任何等价物。

有可能实现这个目标吗?

1 个答案:

答案 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) {
        // ...
    }
}