使用NDK中实现的异常时发生SIGTRAP

Hyu*_*ang 1 java crash android exception android-ndk

我有一个关于ndk的问题,我在本机模块中创建了一个Exception,并尝试在java主应用程序中实现该异常,但是当应用程序崩溃时,我遇到了SIGTRAP。你有什么线索吗?

日志猫

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
Run Code Online (Sandbox Code Playgroud)

本地来源

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);

}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Hyu*_*ang 7

是我的错 C ++的函数类型必须具有返回值,但是缺少该代码,因此我将返回值更改为void。

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答。我想知道为什么我会收到 sigtrap,除了这个之外我找不到任何相同的答案。这节省了我很多时间。 (3认同)

小智 7

调用具有返回值但没有返回语句的 C++ 函数时,我收到 SIGTRAP 代码 1(TRAP_BRKPT) 崩溃。我通过简单地添加正确的返回语句修复了所有崩溃。这只是在我在 Android Studio 中从 GCC 切换到 Clang 之后才开始发生。