title: JNI native异常捕获date: 2021-07-17 23:12:43.55
updated: 2021-07-17 23:12:43.55
url: /?p=314
categories: JNI
tags:
JNI native异常捕获
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import android.os.Bundle; import android.util.Log; import android.view.View;
import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity;
public class MainActivity3 extends AppCompatActivity { static { System.loadLibrary("native-lib"); }
static String name1 = "T1";
public static native void exception(); public static native void exception2() throws NoSuchFieldException; public static native void exception3();
public static native String derryAction();
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
public void exceptionAction(View view) { exception();
try { exception2(); } catch (NoSuchFieldException exception) { exception.printStackTrace(); Log.d("Derry", "exceptionAction: 异常被我捕获了"); }
exception3();
String result = derryAction(); }
public static void show() throws Exception { Log.d("Derry", "show: 1111"); Log.d("Derry", "show: 1111"); Log.d("Derry", "show: 1111"); Log.d("Derry", "show: 1111"); Log.d("Derry", "show: 1111"); Log.d("Derry", "show: 1111");
throw new NullPointerException("我是Java中抛出的异常,我的show方法里面发送了Java逻辑错误"); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| extern "C" JNIEXPORT void JNICALL Java_com_derry_as_1jni_1project_MainActivity3_exception(JNIEnv *env, jclass clazz) { jfieldID f_id = env->GetStaticFieldID(clazz, "name999", "Ljava/lang/String;");
jthrowable thr = env->ExceptionOccurred();
if(thr) { LOGD("C++层有异常 监测到了");
env->ExceptionClear();
jfieldID f_id = env->GetStaticFieldID(clazz, "name1", "Ljava/lang/String;"); }
}
extern "C" JNIEXPORT void JNICALL Java_com_derry_as_1jni_1project_MainActivity3_exception2(JNIEnv *env, jclass clazz) { jfieldID f_id = env->GetStaticFieldID(clazz, "name8888", "Ljava/lang/String;");
jthrowable jthrowable = env->ExceptionOccurred();
if(jthrowable) { LOGD("C++层有异常 监测到了");
env->ExceptionClear();
jclass clz = env->FindClass("java/lang/NoSuchFieldException"); env->ThrowNew(clz, "NoSuchFieldException 是在是找不到 name8888啊,没有办法,抛给你了"); } }
extern "C" JNIEXPORT void JNICALL Java_com_derry_as_1jni_1project_MainActivity3_exception3(JNIEnv *env, jclass clazz) { jmethodID showID = env->GetStaticMethodID(clazz, "show", "()V"); env->CallStaticVoidMethod(clazz, showID);
if (env->ExceptionCheck()) { env->ExceptionDescribe(); env->ExceptionClear(); }
}
|