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");
}

你可能感兴趣的:(JNI)