Android NDK開發之旅14 JNI 快取策略

小楠總發表於2017-12-18

###快取策略

有兩種:

####一、使用區域性的static變數:

JNIEXPORT void JNICALL Java_com_test_JniTest_cache
(JNIEnv * env, jobject jobj){

	static jfieldID fid = NULL;
	jclass clz = (*env)->GetObjectClass(env, jobj);

	if (fid == NULL){
		fid = (*env)->GetFieldID(env, clz, "key", "Ljava/lang/String;");
		printf("fid inti once");
	}
}
複製程式碼

測試:

public native void cache();

public static void main(String[] args) {

	JniTest test = new JniTest();
	for (int i = 0; i < 100; i++) {
		test.cache();
	}
}
複製程式碼

說明:

獲取jfieldID只獲取一次。區域性靜態變數只能在本方法的作用域中使用。

也可以搞個全域性,但是fid不同函式可以使用,但是值不一樣,值很難統一。因此官方推薦區域性的。

區域性靜態變數的生命週期:

  1. 初始化,函式第一次執行
  2. 結束,作用域被銷燬了,但是這個變數還會存在記憶體當中,直到程式結束。

####二、動態庫載入的時候初始化全域性變數

public static native void initIds();

static {
	System.loadLibrary("JniTest");
	initIds();
}

public static void main(String[] args) {

	JniTest test = new JniTest();
	for (int i = 0; i < 100; i++) {
		test.cache();
	}
}
複製程式碼

C程式碼如下:

//初始化兩個全域性變數,動態庫載入完成之後,立刻快取起來
//以後可以在其他函式使用,宣告週期也是跟應用程式(程式)一致
jfieldID key_fid;
jmethodID random_mid;
JNIEXPORT void JNICALL Java_com_dongnaoedu_jni_JniTest_initIds(JNIEnv *env, jclass jcls){
	key_fid = (*env)->GetFieldID(env, jcls, "key", "Ljava/lang/String;");
	random_mid = (*env)->GetMethodID(env, jcls, "genRandomInt", "(I)I");
}
複製程式碼

如果覺得我的文字對你有所幫助的話,歡迎關注我的公眾號:

公眾號:Android開發進階

我的群歡迎大家進來探討各種技術與非技術的話題,有興趣的朋友們加我私人微信huannan88,我拉你進群交(♂)流(♀)

相關文章