JNA捕捉异常

Str*_*ill 8 java exception jna

我有一个关于处理JNA下库引发异常的快速问题...

当我在底层本机代码中抛出异常时,JNA会收到无效的内存访问错误.我假设这是因为C库不能通过它的堆栈抛出异常(它实际上是C++/CLR但是有C输出)?那么有没有真正的方法来报告Java的异常?或"它应该工作",我只是做了一些令人难以置信的错误?

DllExport void Initialize(char* dir)
{
    throw gcnew System::Exception("Testing");
}
Run Code Online (Sandbox Code Playgroud)

Java能够检测到这些抛出的异常会很好,我想我实际上可以考虑将内存指针传递给我的所有C导出并检查它们是否为null,但看起来像是一种迂回的方式.

Phi*_*ler 6

C ++异常只能用C ++代码处理。绝不应该让它们脱离C ++世界(即,C ++代码的C接口永远不要让异常传播)。让C ++异常通过两个C ++模块之间的C代码层传播甚至是不安全的(例如,当C ++函数调用C函数时,C函数又调用C ++函数)。

原因之一是,没有关于如何实现C ++异常的标准,因此,如果由同一编译器(相同版本)进行编译,则C ++模块仅是二进制兼容的。因此,无法设置任何其他语言的代码来处理C ++异常。

在这种情况下(C ++库,C接口,从Java调用),您将必须捕获C ++异常,通过C接口传播信息(例如,通过使用错误返回码),在Java中进行检查并在其中抛出异常。

  • 我相信这在实践中是一个更好的答案,C++ 错误应该在 C++ 端处理,并且仅通过 Java 端的“Native.getLastError()”将错误代码传递回 JVM。在 JNI 中,我发现将 Java 异常抛出回 JVM 也是有争议的,因为抛出异常并不会结束 C++ 进程。 (2认同)

Rog*_*sjö 5

您需要自己处理c ++异常,而是构建一个Java异常,该异常可以传递给代码的Java端。