日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android NDK学习笔记6:异常处理

發布時間:2024/9/30 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 中捕獲?其實很簡單

jthrowable ExceptionOccurred()

舉例如下:

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:异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。