【发布时间】:2012-11-16 14:10:41
【问题描述】:
有什么方法可以在 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 库,我无法控制。这会以任何方式限制我的选择吗?
【问题讨论】:
-
您还没有定义“使用例外”的含义。您是否只想在同一个库中使用异常(即在同一个库中尝试/捕获),然后使用 GNU libstdc++ 运行时它会起作用。另一方面,如果你希望从你的 JNI 库中抛出一个异常并在你的 Java 代码中捕获它,那么这是行不通的。
-
@CadentOrange 我现在有了 - 谢谢。
-
一般来说,是的,您可以在 JNI 中使用 C++ 异常。但是,您必须确保 C++ 异常不会跨越语言障碍(即从您的 JNI 公开函数中逃脱)。如果 C++ 异常逃逸到 JNI 中,您的应用很可能会终止或中止。
-
@CadentOrange:请注意,JNI 定义了从本机代码抛出 Java 异常的函数。不过,这些并不等同于 C++ 异常。
标签: android c++ exception android-ndk java-native-interface