目录
相关文章
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 <jni.h>
#include <string>
#include <android/log.h>
#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");
}
网友评论