Android NDK学习笔记6:异常处理
生活随笔
收集整理的這篇文章主要介紹了
Android NDK学习笔记6:异常处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/119547007
本文出自【趙彥軍的博客】
文章目錄
- JNI捕獲異常
- JNI拋出異常
JNI捕獲異常
如果 JNI 調用 java 代碼,Java 代碼發生發生異常,會發生什么情況
舉例:
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById<View>(R.id.sample_text).setOnClickListener {run()}}external fun run()/*** 這個方法會發生異常*/fun sum() {1 / 0}companion object {// Used to load the 'native-lib' library on application startup.init {System.loadLibrary("native-lib")}} }c++ 代碼實現:
extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {jclass cls = env->GetObjectClass(thiz);jmethodID jmethodId = env->GetMethodID(cls, "sum", "()V");env->CallVoidMethod(thiz, jmethodId); }app 運行起來,會看到程序崩潰,日志如下:
那么如何在 JNI 中捕獲?其實很簡單
舉例如下:
extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {jclass cls = env->GetObjectClass(thiz);jmethodID jmethodId = env->GetMethodID(cls, "sum", "()V");env->CallVoidMethod(thiz, jmethodId);//捕獲異常jthrowable throwable = env->ExceptionOccurred();if (throwable) {//如果有異常發生,輸出異常信息env->ExceptionDescribe();//清除異常信息,app就不會崩潰env->ExceptionClear();} }JNI拋出異常
在上面的章節中,我們學習了JNI 捕獲異常,并且清除了異常信息。但是這樣做治標不治本,我們需要的是能夠捕獲到異常,并且拋出到 Java 層。
jint Throw(jthrowable obj)舉例說明:
extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {jclass cls = env->GetObjectClass(thiz);jmethodID jmethodId = env->GetMethodID(cls, "sum", "()V");env->CallVoidMethod(thiz, jmethodId);//捕獲異常jthrowable throwable = env->ExceptionOccurred();if (throwable) {//拋出異常env->Throw(throwable);} }Java 代碼如下:
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById<View>(R.id.sample_text).setOnClickListener {//捕獲異常try {run()} catch (e: Exception) {e.printStackTrace()}}}external fun run()/*** 這個方法會發生異常*/fun sum() {1 / 0}companion object {// Used to load the 'native-lib' library on application startup.init {System.loadLibrary("native-lib")}} }APP運行起來,我們看看效果:
可以看到我們已經在 Java 代碼中捕獲到了異常。
除此之外,我們還可以自定義異常,然后拋出,示例如下:
extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {jclass cls = env->GetObjectClass(thiz);jmethodID jmethodId = env->GetMethodID(cls, "sum", "()V");env->CallVoidMethod(thiz, jmethodId);//捕獲異常jthrowable throwable = env->ExceptionOccurred();if (throwable) {//清除原有的異常env->ExceptionClear();//創建自定義異常,并拋出jclass exception = env->FindClass("java/lang/Exception");env->ThrowNew(exception, "jni發生異常了");} }看看效果:
總結
以上是生活随笔為你收集整理的Android NDK学习笔记6:异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android NDK学习笔记5:引用类
- 下一篇: JAVA多线程中wait()方法的详细分