c抛出异常给java处理

//JNI 引用常量
//引用类型 ;局部引用和全局引用
//作用:在JNI中告知虚拟机何时回收一个JNI变量
//回收obj对象。对内存做优化
//(*env)->DeleteLocalRef(env,obj); 該函數用於回收局部引用。
//局部引用,通过上述方法,手动释放对象
//1.访问一个很大的java对象,使用完之后,还要进行复杂的耗时操作
//2.创建了大量的局部引用,占用了太多的内存,而且这些局部引用跟后面操作没有关联性




//全局引用
//共享(可以跨多个线程),手动控制内存使用
jstring global_str;


//初始化全局引用
JNIEXPORT void JNICALL Java_com_fourlm_jnitest_JniTest_createGlobalRef
(JNIEnv* env,jobject obj){
jstring str = (*env)->NewStringUTF(env,"全局变量");
global_str = (*env)->NewGlobalRef(env,str);
}


//得到全局引用
JNIEXPORT jstring JNICALL Java_com_fourlm_jnitest_JniTest_getGlobalRef
(JNIEnv* env,jobject obj){
return global_str;
}


//释放全局引用
JNIEXPORT void JNICALL Java_com_fourlm_jnitest_JniTest_deletGlobalRef
(JNIEnv *env,jobject obj){
(*env)->DeleteGlobalRef(env, global_str);
}


//弱全局引用 
//節省內存,在內存不足時,可以釋放所引用的對象
//可以引用一個不常用的對象,如果為NULL,臨時創建
//創建:NewWeakGlobalRef,
//銷毀:DeleteGlobalWeakRef;




//异常处理
//1.保证java代码继续运行
//2.补救措施,可以保证c的代码继续运行


//JNI自己抛出的异常Throwable可以catch到
//用户通过ThrowNew抛出的异常,可以在java捕捉
JNIEXPORT void JNICALL Java_com_fourlm_jnitest_JniTest_exeception
(JNIEnv *env,jobject obj){
jclass cls = (*env)->GetObjectClass(env,obj);
jfieldID fid = (*env)->GetFieldID(env, cls, "key2", "Ljava/lang/String;");
//檢測是否發生java異常
jthrowable exception  = (*env)->ExceptionOccurred(env);
if (exception != NULL)
{
//让java代码可以继续运行,所以需要清空异常信息
(*env)->ExceptionClear(env);
fid = (*env)->GetFieldID(env, cls, "key", "Ljava/lang/String;");
}


jstring jstr = (*env)->GetObjectField(env,obj,fid);


//人为抛出一个异常给java层处理
jclass newExcCls = (*env)->FindClass(env,"java/lang/IllegalArgumentException");
(*env)->ThrowNew(env,newExcCls,"key value is invalid");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值