王学岗NDK系列(五)JNI异常处理+NDK环境详解

一:1.异常处理
1-Java中和JNI中异常处理机制的区别
java中出现异常之后,如果没有用try……catch块捕获,那么程序将会直接奔溃退出,后续的代码都不会执行
JNI程序在执行的时候没有像java一样的try……catch,用C/C++标准的异常处理又是无效的,因为它不是单纯的C/C++程序,而且在native代码中如果出现了异常,也不会像java中一样直接结束,而是会向后继续执行
JNI中为了处理native代码中抛出的java异常,提供了专门处理java异常的方式,这个方式与C/C++中常规函数的标准异常处理无关,JNI专门提供了一个函数集在native代码中检查和处理异常
我们可以得出结论:C/C++,java,jni的异常处理机制都不同

2-JNI异常处理函数分析
jboolean ExceptionCheck(JNIEnv *env);
此函数当有待处理的异常时返回JNI_TURE,否则返回JNI_FALSE

jthrowable ExceptionOccurred(JNIEnv *env);
返回带来异常的引用对象,此异常必须处理或者调用ExceptionClear清除

void ExceptionDescribe(JNIEnv *env);
将当前的异常打印到系统错误报告通道

void ExceptionClear(JNIEnv *env);
清除当前异常,没有异常抛出时没有任何效果

jint Throw(JNIEnv *env, jthrowable obj);
抛出一个异常,成功返回0,否则返回一个负值

jint ThrowNew(JNIEnv *env, jclass clazz,const char *message);
使用指定的消息新建一个java中的异常类对象,引发这个异常并发送message
clazz必须是java中已有的异常类型

void FatalError(JNIEnv *env, const char *msg);
致命错误,会直接终止虚拟机
二NDK环境详解
1,看下当前model的build.graddle文件

这里写图片描述

勾选 exception support 配置文件中会有-fexception
勾选runtimetype information 配置文件中会有 –frtti
这里写图片描述
这个是cmake.exe的配置文件的路径
2,cmakelist.txt配置

cmake_minimum_required(VERSION 3.4.1)
设置cmake的最小使用版本

add_library( # Sets the name of the library.
native-lib //这是你so库的名称

  # Sets the library as a shared library.
  SHARED  //这个参数是共享so库文件 STATIC 静态库 MODULE 模块库

  # Provides a relative path to your source file(s).
      src/main/cpp/native-lib.cpp )//这里是so库的源文件路径,可以使用通配符

//find library之中的库,一般为系统库,放在这个命令里面的不会被打包到我们的 apk里面

find_library( # Sets the name of the path variable.
log-lib //库的特定位置 log库放在log-lib中

      # Specifies the name of the NDK library that
      # you want CMake to locate.
          log )  //指定使用的库

    本地库(自己的库native-lib)想要调用log库的方法,就要在以下命令进行关联

target_link_libraries( # Specifies the target library.
native-lib //我们自己的库

                   # Links the target library to the log library
                   # included in the NDK.
                   ${log-lib} )  //要关联的库,要使用的库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值