我正在尝试为Android制作APP原生代码。 Native代码在cplusplus中。 每当我尝试制作时,都会出现以下错误。
H236Plus.cpp:135:错误:禁用异常处理,使用-fexceptions启用
如何使用-fexceptions启用异常处理,以及在哪里使用它?
答案 0 :(得分:27)
这取决于您使用的运行时。如果您没有使用系统运行时并且使用ndk-build
构建,则可以将以下任何内容添加到Android.mk文件中:
此外,您可以将以下行添加到Application.mk文件中:
您的NDK文件夹中的docs/CPLUSPLUS-SUPPORT.html
中有更多信息
答案 1 :(得分:5)
您需要使用CrystaX的custom NDK进行构建。它具有完整的libstdc ++,RTTI和异常支持。它通常是我所知道的Android开发的最佳工具。
答案 2 :(得分:4)
-fexception是一个编译器开关。如何使用它取决于您的编译器设置。你用的是什么编译器? IDE?构建工具?
答案 3 :(得分:3)
在编译器标志中,在Makefile中添加-fexception。
答案 4 :(得分:2)
使用最新版本的Android Studio,这就是我的build.gradle的样子:
model {
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
buildTypes {
release {
minifyEnabled false
shrinkResources false
proguardFiles.add(file("proguard-rules.txt"))
signingConfig = $("android.signingConfigs.release")
}
}
defaultConfig {
applicationId "my.android.app"
minSdkVersion.apiLevel 16
targetSdkVersion.apiLevel 23
versionCode 29
versionName "my.latest.version"
}
ndk {
moduleName "jni-utils"
ldLibs.add("log")
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
stl "gnustl_static"
}
}
android.signingConfigs {
create("release") {
storeFile "C:\\Android\\Git\\MyProject\\keystore\\keystoreCommon"
storePassword "put you password here"
keyAlias "put your alias here"
keyPassword "put your password here"
}
}
}
答案 5 :(得分:1)
我通过将 cFlags“-fexceptions”添加到build.gradle脚本的ndk部分来解决了这个问题,如下所示:
ndk {
...
cFlags "-fexceptions"
}
答案 6 :(得分:1)
如果您使用ndk-build
构建系统,请参阅@Tundebabzy的this回答。
适用于CMake构建系统
将以下内容添加到模块级build.gradle
文件中:
android {
...
defaultConfig {
...
externalNativeBuild {
// For ndk-build, instead use ndkBuild {}
cmake {
// Enables exception-handling support.
cppFlags "-fexceptions"
}
}
}
}
...
有关详细信息,请参阅this Link。
答案 7 :(得分:0)
对于任何使用NDK示例之一的人来说,这只是一个注释。
他们倾向于在其CMakeLists.txt中设置-fno-exceptions
,您需要将其删除:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -fno-exceptions -frtti")
您可能想检查在使用时是否要-Werror
。