有什么方法可以在Android上的JNI(Java本机接口)库中使用C ++异常?
编辑:我说的是C ++异常处理,它完全是JNI库的内部。也就是说,异常在库中被抛出和捕获,它永远不会逃脱库。
根据Android文档(docs / CPLUSPLUS-SUPPORT.html),仅当我使用'GNU libstdc ++'作为C ++运行时而不是默认值时才支持例外。
问题是文档还声明程序的所有部分都必须使用相同的C ++运行时:
“您只能选择所有的单个C ++运行时 你的代码将取决于。混合编译的共享库是不可能的 针对不同的C ++运行时。“
根据我的解释,这意味着我被迫使用与Dalvik相同的C ++运行时(Android上的Java VM)。
所以,如果Dalvik不使用'GNU libstdc ++',我还有办法在JNI库中使用异常吗?
Dalvik编译的C ++运行时是什么?
编辑:我必须假设无论哪个Java应用程序正在使用我的JNI库,也可能想要使用其他JNI库,我无法控制。这会以任何方式限制我的选择吗?答案 0 :(得分:3)
是的,你可以在
中使用例外APP_STL := gnustl_static
或gnustl_shared
。该文档使用了一种令人生畏的语言,但他们只希望您不要混合那些期望在您的应用中实现不同STL实现的库。这就是为什么该设置具有APP_
前缀,而不是LOCAL_
。
Dalvik VM完全支持文档中列出的任何STL实现。
通常您可以控制JNI的两端,并确保为gnustl_shared编译所有本机组件。这是首选方案。
如果您的业务是提供可能决定也包含其他库的其他人使用的黑匣子库,那么选择gnustl_static
来支持代码中的C ++异常会更安全。这样你就不会依赖他人的善意。您应该小心设计API,以便您的本机对象(,尤其是异常)永远不会暴露给其他组件。