總結
實驗材料:
- Android系統8.1.0 (以下實驗結果,可能與Android系統相關相關)
- Java異常(分母爲0)
public void makeException() { int i = 1 / 0; }
- Native方法,調用上述Java方法
實驗結論
-
Native調用Java異常代碼,且Native沒有任何異常處理時
- java異常方法中斷
- Java異常拋出
- native方法繼續運行
- 進程重啓
-
Native層調用ExceptionClear
- Java異常不再拋出
- 進程不再重啓
-
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