4

有什么方法可以在 Android 上的 JNI(Java 本机接口)库中使用 C++ 异常?

编辑:我说的是完全在 JNI 库内部的 C++ 异常处理。也就是说,异常在库中被抛出和捕获,它永远不会离开库。

根据 Android 文档 (docs/CPLUSPLUS-SUPPORT.html),只有当我使用 'GNU libstdc++' 作为 C++ 运行时而不是默认值时,才支持异常。

问题是文档还声明程序的所有部分都必须使用相同的 C++ 运行时:

“您只能选择所有代码都依赖的单个 C++ 运行时。不能混合针对不同 C++ 运行时编译的共享库。”

根据我的解释,这意味着我不得不使用与 Dalvik(Android 上的 Java VM)相同的 C++ 运行时。

那么,如果 Dalvik 不使用“GNU libstdc++”,是否还有一种方法可以在我的 JNI 库中使用异常?

Dalvik 是针对什么 C++ 运行时编译的?

编辑:我必须假设无论哪个 Java 应用程序正在使用我的 JNI 库,可能还想使用其他 JNI 库,我无法控制。这会以任何方式限制我的选择吗?

4

1 回答 1

3

是的,您可以使用例外

APP_STL := gnustl_static

gnustl_shared。该文档使用了一种令人生畏的语言,但他们只希望您不要在您的应用程序中混合期望不同 STL 实现的库。这就是为什么设置有APP_前缀,而不是LOCAL_.

Dalvik VM 完全支持文档中列出的任何 STL 实现。

通常你控制你的 JNI 的两边,并且可以确保所有的本地组件都是为 gnustl_shared 编译的。这是首选方案。

如果您的业务是提供一个可供其他人使用的黑盒库,而这些人可能决定也包含其他库,那么选择gnustl_static在您的代码中支持 C++ 异常会更安全。这样你就不会依赖别人的好意。您应该小心设计您的 API,以使您的本机对象(尤其是异常)永远不会暴露给其他组件。

于 2012-11-28T18:41:20.193 回答