Android NDK R5和支持C++异常

pla*_*hos 13 c++ exception android-ndk

我正在尝试使用NDK 5完整的C++ gnustl:

CPLUSPLUS-SUPPORT.html状态:

NDK工具链支持C++异常,因为NDK r5,但是出于与先前版本的兼容性原因,默认情况下所有C++源都使用-fno-exceptions支持进行编译.

要启用它,请使用'-fexceptions'C++编译器标志.这可以通过将以下内容添加到Android.mk中的每个模块定义来完成:

LOCAL_CPPFLAGS += -fexceptions
Run Code Online (Sandbox Code Playgroud)

更简单地说,在Application.mk中添加一行,该设置将自动应用于所有项目的NDK模块:

APP_CPPFLAGS += -fexceptions
Run Code Online (Sandbox Code Playgroud)

sources/cxx-stl/gnu-libstdc++/README 状态:

该目录包含GNU libstdc ++ - v3 C++标准模板库实现的头文件和预构建二进制文件.

这些是通过build/tools下的rebuild-all-prebuilt.sh脚本从工具链源生成的.

要使用它,请在Application.mk中将APP_STL定义为'gnustl_static'.有关详细信息,请参阅docs/CPLUSPLUS-SUPPORT.html.

此实现完全支持C++异常和RTTI.

但所有使用异常的尝试都失败了 另一种NDK存在于http://www.crystax.net/android/ndk-r4.php上.使用该NDK中的hello-jni示例不起作用.创建一个Application.xmlwith 后,NDK 5的编译工作正常

APP_STL := gnustl_static
Run Code Online (Sandbox Code Playgroud)

将APP_STL设置为gnustl_static也自动启用-frtti-fexceptions.但它死于与我自己的实验相同的可怕死亡.

我已经设法得到一个崩溃的代码的最小例子:

try {
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","trhown!");
    throw "Wrong object type.";
} catch (char* b) {
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","catched!");
}
Run Code Online (Sandbox Code Playgroud)

就是我失去了一些东西或者是在陈述READMECPLUSPLUS-SUPPORT.html只是简单的错误?

pla*_*hos 9

事实证明,异常可以工作,但前提是异常是从std :: exception继承的.在我的例子中,异常层次结构并不总是包含std :: exception,它打破了catch/throw.奇怪的是,当为x86/Mac OS编译时,抛出的字符串作为例外工作.我通过修改我使用的例外来解决我的问题.

  • 在C++中使用不是从std :: exception派生的类型是非常合法的,因此它在OSX上运行并不奇怪.我工作的代码库将整数抛出为异常,并在Android中运行. (3认同)

grr*_*sel 7

NDK-r5工具支持在C++代码中使用异常和RTTI.但是,在存在RTTI或异常的情况下,不支持使用除GNU STL之外的STL作为静态库.

提供的STLport不能与异常或RTTI一起使用.

请注意,在STL实现之间交换时可能需要清理构建对象.

  • 在这种情况下,我没有正确阅读你的答案. (3认同)