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

目录

相关文章

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语言代码中产生异常好像并不能捕捉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容