Andriod NDK:SIGABRT在抛出c ++ std :: exception时

时间:2017-08-21 22:48:48

标签: c++ exception-handling android-ndk java-native-interface c++14

我正在努力将原生c ++异常表现为Java。 我已经尝试过std :: runtime_error和std :: exception,但两者都使进程中止。

某些背景: 我正确地实现了JNI处理(但我甚至没有实现):

JNIEXPORT jint JNICALL
Java_com_sdk_gateway_SetValue(JNIEnv *env, jobject obj, jfloat value)
{
    jint retCode = RETVALUE::ERR_FAILED;
    try
    {
        retCode = gateway::SetValue(value);
    }
    catch(std::runtime_error ex) // or catch(std::exception ex)
    { 
        // not even getting here in debug
        throwJavaException(env, ex.what());
    }

    return retCode;
}

我的本​​机编译器开关(LLVM):

android.ndk {
    moduleName = "gtaNativeCode"

    // add compilation flags
    cppFlags.add("-DANDROID")
    cppFlags.add("-frtti")
    cppFlags.add("-std=c++14")
    cppFlags.add("-fexceptions") // Enables exception-handling support.

    // include headers
    cppFlags.add("-I${file("native-src")}".toString())

    ldLibs.addAll("android", "dl", "log", "z", "atomic")

    // https://developer.android.com/ndk/guides/cpp-support.html
    //stl = "gnustl_static"  // The GNU STL (static library). This is the default runtime when using CMake or a standalone toolchain.
    //stl = "stlport_static"
    stl = "c++_static"  // LLVM compiler
}

在c ++中,我只是抛出异常这个简单的模式:

RETVALUE gateway::SetValue(float value)
{
    RETVALUE result = RETVALUE::ERR_FAILED;

    // doing some stuff

    if (0 != errno)
            throw std::runtime_error("error message"); // << SIGABRT as soon as the throw is executed 

    return result;
}

一旦执行了throw,我就会在Android Studio中获得SIGABRT(v2.3.3,最新的NDK)。

我在论坛中阅读了所有其他问题,但唯一的线索是从“c ++ _ static”切换到“gnustl_static”(“stl_port”不支持我需要的mutex,chrono&amp; thread),但不幸的是,在我的情况下,这不是一个选项,因为我有大量使用std :: string转换函数的库(即:to_string,strtold,stoi等),我无法避免使用它。

在任何情况下,根据官方网站(https://developer.android.com/ndk/guides/cpp-support.html),“c ++ _ static”DOES支持异常,因此无法证明我应该更改的原因(除非LLVM libc ++是错误的)。

有人可以帮我一些想法吗? 感谢

&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&GT;&gt;编辑&LT;&LT; &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;

根据建议,我将本机编译从实验gradle转移到标准CMAKE。

一切都像以前一样工作,但不幸的是结果是一样的:只要我从JVM中捕获C ++异常,该过程就会中止。

这是我的新gradle文件(如果它对某人也有帮助):

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
defaultConfig {

    minSdkVersion 21
    targetSdkVersion 25

    externalNativeBuild {

        cmake {
            // Pass arguments to CMake
            arguments "-DANDROID_TOOLCHAIN=clang",
                    "-DANDROID_ARM_NEON=TRUE",
                    "-DANDROID_STL=c++_static",
                    "-DCMAKE_BUILD_TYPE=Debug"

            cppFlags "-frtti" // Enables RTTI support.
            cppFlags "-fexceptions" // Enables exception-handling support.
            cppFlags "-std=c++14"                
        }
    }

    // Similar to other properties in the defaultConfig block,
    // you can configure the ndk block for each product flavor
    // in your build configuration.
    ndk {

        moduleName "gtaNativeCode"
        abiFilters 'armeabi', 'armeabi-v7a', 'mips', 'x86'
    }

    // If you want Gradle to package prebuilt native libraries
    // with your APK, modify the default source set configuration
    // to include the directory of your prebuilt .so files as follows.
    sourceSets.main {
        // C and C++ source code
        jni.srcDirs = [] //disable automatic ndk-build
        jniLibs.srcDirs 'src/main/native'
    }
}

externalNativeBuild {
    cmake {
        path 'src/main/native/CMakeLists.txt'
    }
}

buildTypes {
    debug {
        debuggable true
        jniDebuggable true
    }
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

// This allows the library project to be built in debug mode, so we can actually debug it
publishNonDefault true
}

configurations {
    // Expose the debug version of the library to other modules
    debug
    release
}

dependencies {
    compile 'com.android.support:support-annotations:25.3.1'
}

0 个答案:

没有答案