启用异常C ++

时间:2010-07-10 05:10:50

标签: android c++ makefile cmake android-ndk

我正在尝试为Android制作APP原生代码。 Native代码在cplusplus中。 每当我尝试制作时,都会出现以下错误。

  

H236Plus.cpp:135:错误:禁用异常处理,使用-fexceptions启用

如何使用-fexceptions启用异常处理,以及在哪里使用它?

8 个答案:

答案 0 :(得分:27)

这取决于您使用的运行时。如果您没有使用系统运行时并且使用ndk-build构建,则可以将以下任何内容添加到Android.mk文件中:

  • LOCAL_CPP_FEATURES + =例外(推荐)
  • LOCAL_CPPFLAGS + = -fexceptions

此外,您可以将以下行添加到Application.mk文件中:

  • APP_CPPFLAGS + = -fexceptions

您的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