jni中的引用
jni引用类型分为:局部引用和全局引用
局部引用
局部引用最大的特点就是能够让我们边使用,边释放,保证小的的内存消耗;
比如,访问较大的Java对象(Bitmap、Array),使用完后,还要进行其他复杂的耗时操作,此时可以
先将对象回收;或者,当方法中创建了大量的局部引用,占用了太多的内存,而且这些局部引用跟后
面的操作没有关联,也可以直接回收掉;
1 | JNIEXPORT jstring JNICALL Java_com_my_jnitest_JniTest_releaseCRef |
全局引用
全局引用可以被全局多个函数创建、使用和释放,所以使用之前必须先做判空处理;
全局引用是可以被多个线程共享的,但需要注意线程安全问题;
1 | // 创建全局引用 |
弱全局引用
弱全局引用其实与Java中的弱引用类似,在垃圾回收时,如果内存不足,则引用对象会被回收;
通过弱全局引用,可以达到灵活创建临时变量,当检测到为NULL时,我们再次再创建;1
2
3
4
5
6
7
8jstring weak_global_str;
JNIEXPORT void JNICALL Java_com_my_jnitest_JniTest_createWeakGlobal
(JNIEnv * env, jobject jobj){
// 创建全局引用,必须通过包裹局部引用来完成
jstring obj = (*env)->NewStringUTF(env, "jni is powerful!");
global_str = (*env)->NewWeakGlobalRef(env, obj);
}