美文网首页
Android NDK开发:Native层处理Java层异常

Android NDK开发:Native层处理Java层异常

作者: itfitness | 来源:发表于2021-02-15 18:06 被阅读0次

目录

相关文章

Android NDK开发:java调用dll动态链接库方法
Android NDK开发:JNIEnv的原理
Android NDK开发:C修改Java的属性
Android NDK开发:C调用Java层方法
Android NDK开发:C创建Java层的对象
Android NDK开发:C操作Java层的数组
Android NDK开发:Native层的变量管理及静态缓存

Native层的异常处理

相关函数
用于检测异常的发生的函数有:
ExceptionCheck:检查是否发生了异常,若有异常返回JNI_TRUE,否则返回JNI_FALSE
ExceptionOccurred:检查是否发生了异常,若用异常返回该异常的引用,否则返回NULL
用于打印堆栈信息的有:
ExceptionDescribe:打印异常的堆栈信息
用于清理异常的有:
ExceptionClear:清除异常堆栈信息
用于跑出异常的有:
ThrowNew:在当前线程触发一个异常,并自定义输出异常信息
Throw:丢弃一个现有的异常对象,在当前线程触发一个新的异常
FatalError:致命异常,用于输出一个异常信息,并终止当前VM实例(即退出程序)

代码演示
C代码:

JNIEXPORT void JNICALL Java_com_itfitness_NdkDemo_exception
(JNIEnv* env, jclass jclazz,jobject jobj) {
    
    //调用一个Java中抛出异常的方法,用于产生异常
    jmethodID mid = (*env)->GetMethodID(env, jclazz, "callException", "()V");
    (*env)->CallVoidMethod(env, jobj, mid);

    //检测异常
    jthrowable throwable = (*env)->ExceptionOccurred(env);
    if (throwable) {
        //清除异常
        (*env)->ExceptionClear(env);
        //创建Java层的异常并抛出
        jclass j_exception = (*env)->FindClass(env,"java/lang/RuntimeException");
        (*env)->ThrowNew(env, j_exception,"Test RuntimeException");
    }
}

Java代码:

package com.itfitness;

public class NdkDemo {
    static {
        System.load("E:\\Project\\VS\\Jni异常处理\\x64\\Release\\Jni异常处理.dll");
    }
    public static void main(String[] args) {
        try {
            exception(new NdkDemo());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private void callException() throws RuntimeException{
        throw new RuntimeException();
    }
    public native static void exception(NdkDemo ndkDemo) throws NoSuchMethodException;
}

运行结果:


注意

Jni中的函数好像只能捕捉Java层的异常,我试了几次从C语言代码中产生异常好像并不能捕捉。

相关文章

网友评论

      本文标题:Android NDK开发:Native层处理Java层异常

      本文链接:https://www.haomeiwen.com/subject/vnopxltx.html