Android NDK开发:C++捕捉异常并将异常抛给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层的变量管理及静态缓存
Android NDK开发:Native层的异常处理
Android NDK开发:结构体的偏移量及所占大小
Android NDK开发:运算符重载与友元函数
Android NDK开发:用C++手写一个简单的ArrayList
Android NDK开发:Native层实现数组的拷贝

实现意义

由于当我们在编写C或C++代码时也会产生一些异常,为了防止程序崩溃,我们也需要进行异常的捕捉,并且最好是将捕捉的异常抛给Java层,这样便可方便我们查找异常的位置。

代码展示

Java代码:

public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("native-lib");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            //在Java层中捕捉Native层抛出的异常
            callNativeException();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * Native层的有异常的方法
     * @return
     */
    public native void callNativeException();
}

C++代码:

#include 
#include 
#include 
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,__VA_ARGS__ ,__VA_ARGS__) // 定义LOGE类型
class Student{
public:
    void print_msg(char * msg){
        LOGE("打印消息",msg);
    }
};

/**
 * 自定义的空指针异常
 */
class NullPointException{
private:
    char * msg;
public:
    NullPointException(char * msg){
        this->msg = msg;
    }
    char * get_msg(){
        return this->msg;
    }
};

extern "C"
JNIEXPORT void JNICALL
Java_com_itfitness_exceptiondemo_MainActivity_callNativeException(JNIEnv *env, jobject instance) {
    Student* student = new Student();
    student->print_msg("我是消息");
    //将Student指针赋值为NULL,制造一个空指针异常
    student = NULL;
    try {
        if(student == NULL){
            //当student是NULL的时候就抛一个自定义的空指针异常
            throw NullPointException("Native Student 空指针异常");
        } else{
            student->print_msg("我还是消息");
        }
    }catch (NullPointException e){
        LOGE("捕捉异常:",e.get_msg());
        //捕捉异常后将异常再抛给Java层
        jclass j_exception = env->FindClass("java/lang/NullPointerException");
        env->ThrowNew(j_exception,e.get_msg());
    }
}

其实C++中的异常捕捉跟Java中的差不多,只不过C++中的异常可以抛任意类型,比如:

    int i = 0;
    try {
        if(i == 0){
            throw i;
        }
    }catch (int e){
        LOGE("捕捉异常:","数为0");
    }

运行结果

案例源码

https://gitee.com/itfitness/ExceptionDemo

你可能感兴趣的:(Android NDK开发:C++捕捉异常并将异常抛给Java层)