我对ndk有疑问 我在本机模块中创建了一个Exception,并尝试在java主应用程序中实现异常,但是当应用程序崩溃时我遇到了SIGTRAP。 你有任何线索吗?
logcat的
12-11 14:12:43.212 28091 28091 F libc : Fatal signal 5 (SIGTRAP), code 1 in tid 28091 (d2002.myndkapp3)
12-11 14:12:43.267 444 444 F DEBUG : pid: 28091, tid: 28091, name: d2002.myndkapp3 >>> com.hhd2002.myndkapp3 <<<
12-11 14:12:43.548 403 403 E lowmemorykiller: Error writing /proc/28091/oom_score_adj; errno=22
12-11 14:12:43.551 474 474 I Zygote : Process 28091 exited due to signal (5)
12-11 14:12:43.588 1231 3425 I ActivityManager: Process com.hhd2002.myndkapp3 (pid 28091) has died
原生资源
extern "C"
JNIEXPORT jint
JNICALL
Java_com_hhd2002_myndkapp3_MainActivity_throwMyException(
JNIEnv *env,
jobject instance) {
auto exClass = env->FindClass("java/lang/Exception");
env->ThrowNew(exClass, 0);
env->DeleteLocalRef(exClass);
}
java源
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
...
this.findViewById(R.id.btn_0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
throwMyException();
} catch (Exception e) {
Log.d("mainactivity", e.toString());
}
}
});
}
private native int throwMyException() throws Exception;
}
答案 0 :(得分:4)
这是我的错。 c ++的函数类型必须有返回值,但缺少该代码, 所以我把回报改为无效。
extern "C"
JNIEXPORT void
JNICALL
Java_com_hhd2002_myndkapp3_MainActivity_throwMyException(
JNIEnv *env,
jobject instance) {
auto exClass = env->FindClass("java/lang/Exception");
env->ThrowNew(exClass, 0);
env->DeleteLocalRef(exClass);
}
答案 1 :(得分:2)
调用具有返回值但没有返回语句的C ++函数时,我得到SIGTRAP代码1(TRAP_BRKPT)崩溃。我通过添加适当的return语句修复了所有崩溃问题。这是在我从GCC切换到Android Studio中的Clang之后才开始发生的。