我可以在安卓系统的JNI库中使用C++异常吗
Can I use C++ exceptions in JNI library on Android?
有什么方法可以在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,这样您的本机对象(,尤其是异常)就不会暴露给其他组件。
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常