我可以在安卓系统的JNI库中使用C++异常吗

Can I use C++ exceptions in JNI library on Android?

本文关键字:C++ 异常 JNI 系统 我可以      更新时间:2023-10-16

有什么方法可以在Android上的JNI(Java Native Interface)库中使用C++异常吗?

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

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

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

"您只能选择一个C++运行时您的代码将依赖。不可能混合编译的共享库针对不同的C++运行时。">

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

那么,如果Dalvik不使用"GNU libstdc++",我还有办法在我的JNI lib中使用异常吗?

Dalvik编译时使用的是什么C++运行时?

编辑:我不得不假设,无论哪个Java应用程序正在使用我的JNI库,都可能想要使用其他JNI库。这会限制我的选择吗?

是的,您可以在中使用异常

APP_STL := gnustl_static

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

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

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

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