JNA捕捉异常

时间:2011-08-29 14:36:35

标签: java exception jna

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

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