Android NDK对象的引用-全局引用,局部引用,弱引用

百度了一下,google了一下,关于NDK引用的介绍无10篇中就有9.9篇是相同的,对于这种问题,我只能呜呼哀哉了!!java


局部引用(函数内部对象类型变量):在C或C++中,局部变量表示只运行范围局限在该变量最近的 “{}”花括号里,常见的就是函数中的变量了,但局部引用和局部变量不一样了,引用的主体是对象,指针,android

所以,设涉及到内存回收问题。同局部变量同样,局部对象在函数执行完成后会被当即销毁。缓存

(错误的用法1:将局部引用赋值给全局引用或弱引用)函数

 (错误的用法 : 引用被静态缓存,这种方法十分危险,容易致使程序蹦退,但不是不能够,只是引用的主题必须不是对象才行,好比jfieldID,jmethodID等)google

JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
  (JNIEnv * env, jobject thiz)
  {
    static jfieldID nameField = NULL;
    if(nameField==NULL)
    {
	nameField =  env->GetFieldID(clazz,"name","Ljava/lang/String;");
    }
	//do somthing
}


全局引用(函数外部对象类型变量):全局引用表示把局部引用经过某种方式复制给全局对象,而且该变量不会自动销毁,须要手动销毁spa

jclass globalJclazz = NULL;
JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
  (JNIEnv * env, jobject thiz)
{
	if(globalJclazz==NULL)
	{
		__android_log_print(ANDROID_LOG_INFO,"REF","--1-->");
		globalJclazz = (jclass)(env->NewGlobalRef(env->GetObjectClass(thiz))); //转为全局引用
	}else{
		__android_log_print(ANDROID_LOG_INFO,"REF","--2-->");
		env->DeleteGlobalRef(globalJclazz);
		globalJclazz =NULL;
	}
}


弱引用:做用域同全局变量同样,但不能保证该引用一致从在,当内存不足时会自动销毁指针

jclass weakclass = NULL;

JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
  (JNIEnv * env, jobject thiz)
{
	if(weakclass==NULL || (env->IsSameObject(weakclass,NULL))==JNI_TRUE)
	{
		jclass jclzz  = env->GetObjectClass(thiz);
		weakclass = (jclass)(env->NewWeakGlobalRef(jclzz));
	}else{
		env->DeleteWeakGlobalRef(weakclass);
		weakclass = NULL;
	}
}
相关文章
相关标签/搜索