【JNI C++學習篇-Exception】

總結

實驗材料:

  • Android系統8.1.0 (以下實驗結果,可能與Android系統相關相關)
  • Java異常(分母爲0) public void makeException() { int i = 1 / 0; }
  • Native方法,調用上述Java方法

實驗結論

  1. Native調用Java異常代碼,且Native沒有任何異常處理時

    • java異常方法中斷
    • Java異常拋出
    • native方法繼續運行
    • 進程重啓
  2. Native層調用ExceptionClear

    • Java異常不再拋出
    • 進程不再重啓
  3. ExceptionDescribe

    • 有Java異常描述打印

Git

tag爲exception_v1.0
源代碼Git地址
[email protected]:AlbertSnow/GraphicDemo.git

extern "C" JNIEXPORT void JNICALL Java_com_albertsnow_graphicdemo_jni_exception_TestException_testException (
        JNIEnv *env, jobject thisObj, jstring msg) {
    jclass cls = env->GetObjectClass(thisObj);

    jmethodID  jmethodId = env->GetMethodID(cls, "makeException", "()V");

    LOGE("start method call 1");
    env->CallVoidMethod(thisObj, jmethodId);
    LOGE("end method call");

    if (env->ExceptionCheck()) {
        LOGE("Exception occur.");
//        env->ExceptionDescribe();
//        env->ExceptionClear();
//        env->ExceptionOccurred()
    }

}

上述源碼

2019-10-17 20:10:12.139 26700-26700/com.albertsnow.graphicdemo I/TestException: start method call 1
2019-10-17 20:10:12.139 26700-26700/com.albertsnow.graphicdemo I/TestException: end method call
2019-10-17 20:10:12.139 26700-26700/com.albertsnow.graphicdemo I/TestException: Exception occur.
2019-10-17 20:10:12.139 26700-26700/com.albertsnow.graphicdemo D/AndroidRuntime: Shutting down VM
    
    
    --------- beginning of crash
2019-10-17 20:10:12.144 26700-26700/com.albertsnow.graphicdemo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.albertsnow.graphicdemo, PID: 26700
    java.lang.ArithmeticException: divide by zero
        at com.albertsnow.graphicdemo.jni.exception.TestException.makeException(TestException.java:25)
        at com.albertsnow.graphicdemo.jni.exception.TestException.testException(Native Method)
        at com.albertsnow.graphicdemo.jni.exception.ExceptionActivity$1.onClick(ExceptionActivity.java:27)
        at android.view.View.performClick(View.java:6319)
        at android.view.View$PerformClick.run(View.java:24939)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:192)
        at android.app.ActivityThread.main(ActivityThread.java:6738)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
2019-10-17 20:10:12.167 26700-26700/? I/Process: Sending signal. PID: 26700 SIG: 9

反註解env->ExceptionDescribe();

2019-10-17 20:09:20.212 26235-26235/com.albertsnow.graphicdemo I/TestException: start method call 1
2019-10-17 20:09:20.213 26235-26235/com.albertsnow.graphicdemo I/TestException: end method call
2019-10-17 20:09:20.213 26235-26235/com.albertsnow.graphicdemo I/TestException: Exception occur.
2019-10-17 20:09:20.214 26235-26235/com.albertsnow.graphicdemo W/System.err: java.lang.ArithmeticException: divide by zero
2019-10-17 20:09:20.215 26235-26235/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.TestException.makeException(TestException.java:25)
2019-10-17 20:09:20.216 26235-26235/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.TestException.testException(Native Method)
2019-10-17 20:09:20.216 26235-26235/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.ExceptionActivity$1.onClick(ExceptionActivity.java:27)
2019-10-17 20:09:20.216 26235-26235/com.albertsnow.graphicdemo W/System.err:     at android.view.View.performClick(View.java:6319)
2019-10-17 20:09:20.217 26235-26235/com.albertsnow.graphicdemo W/System.err:     at android.view.View$PerformClick.run(View.java:24939)
2019-10-17 20:09:20.217 26235-26235/com.albertsnow.graphicdemo W/System.err:     at android.os.Handler.handleCallback(Handler.java:790)
2019-10-17 20:09:20.217 26235-26235/com.albertsnow.graphicdemo W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
2019-10-17 20:09:20.218 26235-26235/com.albertsnow.graphicdemo W/System.err:     at android.os.Looper.loop(Looper.java:192)
2019-10-17 20:09:20.218 26235-26235/com.albertsnow.graphicdemo W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6738)
2019-10-17 20:09:20.218 26235-26235/com.albertsnow.graphicdemo W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2019-10-17 20:09:20.218 26235-26235/com.albertsnow.graphicdemo W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)
2019-10-17 20:09:20.219 26235-26235/com.albertsnow.graphicdemo W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
2019-10-17 20:09:20.219 26235-26235/com.albertsnow.graphicdemo D/AndroidRuntime: Shutting down VM
2019-10-17 20:09:20.223 26235-26235/com.albertsnow.graphicdemo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.albertsnow.graphicdemo, PID: 26235
    java.lang.ArithmeticException: divide by zero
        at com.albertsnow.graphicdemo.jni.exception.TestException.makeException(TestException.java:25)
        at com.albertsnow.graphicdemo.jni.exception.TestException.testException(Native Method)
        at com.albertsnow.graphicdemo.jni.exception.ExceptionActivity$1.onClick(ExceptionActivity.java:27)
        at android.view.View.performClick(View.java:6319)
        at android.view.View$PerformClick.run(View.java:24939)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:192)
        at android.app.ActivityThread.main(ActivityThread.java:6738)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
2019-10-17 20:09:20.243 26235-26235/com.albertsnow.graphicdemo I/Process: Sending signal. PID: 26235 SIG: 9

反註解env->ExceptionClear();
後VM不再崩潰,和沒有異常一樣

2019-10-17 20:07:46.101 25759-25759/com.albertsnow.graphicdemo I/TestException: start method call 1
2019-10-17 20:07:46.108 25759-25759/com.albertsnow.graphicdemo I/TestException: end method call
2019-10-17 20:07:46.108 25759-25759/com.albertsnow.graphicdemo I/TestException: Exception occur.
2019-10-17 20:07:46.108 25759-25759/com.albertsnow.graphicdemo W/System.err: java.lang.ArithmeticException: divide by zero
2019-10-17 20:07:46.109 25759-25759/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.TestException.makeException(TestException.java:25)
2019-10-17 20:07:46.109 25759-25759/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.TestException.testException(Native Method)
2019-10-17 20:07:46.110 25759-25759/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.ExceptionActivity$1.onClick(ExceptionActivity.java:27)
2019-10-17 20:07:46.110 25759-25759/com.albertsnow.graphicdemo W/System.err:     at android.view.View.performClick(View.java:6319)
2019-10-17 20:07:46.110 25759-25759/com.albertsnow.graphicdemo W/System.err:     at android.view.View$PerformClick.run(View.java:24939)
2019-10-17 20:07:46.110 25759-25759/com.albertsnow.graphicdemo W/System.err:     at android.os.Handler.handleCallback(Handler.java:790)
2019-10-17 20:07:46.112 25759-25759/com.albertsnow.graphicdemo W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
2019-10-17 20:07:46.113 25759-25759/com.albertsnow.graphicdemo W/System.err:     at android.os.Looper.loop(Looper.java:192)
2019-10-17 20:07:46.113 25759-25759/com.albertsnow.graphicdemo W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6738)
2019-10-17 20:07:46.113 25759-25759/com.albertsnow.graphicdemo W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2019-10-17 20:07:46.114 25759-25759/com.albertsnow.graphicdemo W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)
2019-10-17 20:07:46.114 25759-25759/com.albertsnow.graphicdemo W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
2019-10-17 20:07:46.114 25759-25759/com.albertsnow.graphicdemo I/ExceptionActivity: receive some inoiooooooooo

主動拋出異常

        // 拋出我們自己的異常處理
        jclass newExcCls;
        newExcCls = env->FindClass("java/lang/Exception");
        if (newExcCls == NULL) {
            return;
        }
        env->ThrowNew(newExcCls, "throw from C Code.");
2019-10-17 20:16:13.280 27232-27232/com.albertsnow.graphicdemo I/TestException: start method call 1
2019-10-17 20:16:13.280 27232-27232/com.albertsnow.graphicdemo I/TestException: end method call
2019-10-17 20:16:13.280 27232-27232/com.albertsnow.graphicdemo I/TestException: Exception occur.
2019-10-17 20:16:13.280 27232-27232/com.albertsnow.graphicdemo W/System.err: java.lang.ArithmeticException: divide by zero
2019-10-17 20:16:13.281 27232-27232/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.TestException.makeException(TestException.java:25)
2019-10-17 20:16:13.281 27232-27232/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.TestException.testException(Native Method)
2019-10-17 20:16:13.281 27232-27232/com.albertsnow.graphicdemo W/System.err:     at com.albertsnow.graphicdemo.jni.exception.ExceptionActivity$1.onClick(ExceptionActivity.java:27)
2019-10-17 20:16:13.281 27232-27232/com.albertsnow.graphicdemo W/System.err:     at android.view.View.performClick(View.java:6319)
2019-10-17 20:16:13.281 27232-27232/com.albertsnow.graphicdemo W/System.err:     at android.view.View$PerformClick.run(View.java:24939)
2019-10-17 20:16:13.281 27232-27232/com.albertsnow.graphicdemo W/System.err:     at android.os.Handler.handleCallback(Handler.java:790)
2019-10-17 20:16:13.281 27232-27232/com.albertsnow.graphicdemo W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
2019-10-17 20:16:13.282 27232-27232/com.albertsnow.graphicdemo W/System.err:     at android.os.Looper.loop(Looper.java:192)
2019-10-17 20:16:13.282 27232-27232/com.albertsnow.graphicdemo W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6738)
2019-10-17 20:16:13.282 27232-27232/com.albertsnow.graphicdemo W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2019-10-17 20:16:13.282 27232-27232/com.albertsnow.graphicdemo W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)
2019-10-17 20:16:13.282 27232-27232/com.albertsnow.graphicdemo W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
2019-10-17 20:16:13.282 27232-27232/com.albertsnow.graphicdemo D/AndroidRuntime: Shutting down VM
2019-10-17 20:16:13.285 27232-27232/com.albertsnow.graphicdemo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.albertsnow.graphicdemo, PID: 27232
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:560)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825) 
     Caused by: java.lang.Exception: throw from C Code.
        at com.albertsnow.graphicdemo.jni.exception.TestException.testException(Native Method)
        at com.albertsnow.graphicdemo.jni.exception.ExceptionActivity$1.onClick(ExceptionActivity.java:27)
        at android.view.View.performClick(View.java:6319)
        at android.view.View$PerformClick.run(View.java:24939)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:192)
        at android.app.ActivityThread.main(ActivityThread.java:6738)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:550) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825) 
2019-10-17 20:16:13.306 27232-27232/com.albertsnow.graphicdemo I/Process: Sending signal. PID: 27232 SIG: 9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章