###快取策略
有兩種:
####一、使用區域性的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不同函式可以使用,但是值不一樣,值很難統一。因此官方推薦區域性的。
區域性靜態變數的生命週期:
- 初始化,函式第一次執行
- 結束,作用域被銷燬了,但是這個變數還會存在記憶體當中,直到程式結束。
####二、動態庫載入的時候初始化全域性變數
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");
}
複製程式碼
如果覺得我的文字對你有所幫助的話,歡迎關注我的公眾號:

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