我正在努力将原生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'
}