2011-08-29 120 views
6

我对处理异常被库下JNA抛出一个快速的问题...JNA捕获异常

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

DllExport void Initialize(char* dir) 
{ 
    throw gcnew System::Exception("Testing"); 
} 

这将是很好的Java能够检测这些抛出的异常,我想我其实可以考虑通过内存指针到所有我的C出口和检查,看看是否这些都是空或不是,但似乎是一个迂回的方式。

回答

4

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

+0

因此,我会在C++/CLR端捕获它,并将它作为多个参数传回给java? (或者在想要简单的错误报告的情况下,只需要第二个参数,“char * err”就足够了)。我想我可能必须这样做。 – StrangeWill

4

C++异常只能在C++代码中处理。他们绝不应该被允许逃离C++世界(即,C++代码的C接口绝对不应该让异常传播)。让C++异常通过两个C++模块之间的一层C代码传播是不安全的(例如,当一个C++函数调用一个C函数,该函数又调用一个C++函数时)。

其中一个原因是没有关于如何实现C++异常的标准,因此如果由相同编译器编译(在相同版本中),C++模块只是二进制兼容的。因此,不能设置任何其他语言的代码来处理C++异常。在这种情况下(C++库,C接口,从Java调用),您必须捕获C++异常,通过C接口传播信息(例如,通过使用错误返回码),在Java中检查它并在那里抛出异常。