这篇文章主要讲解了“Android JNI调用时怎么缓存字段和ID”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android JNI调用时怎么缓存字段和ID”吧!
创新互联总部坐落于成都市区,致力网站建设服务有成都做网站、成都网站建设、网络营销策划、网页设计、网站维护、公众号搭建、小程序开发、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!使用时缓存
使用时缓存,就是在调用时查找一次,然后将它缓存成 static 变量,这样下次调用时就已经被初始化过了。
直到内存释放了,才会缓存失效。
extern "C" JNIEXPORT void JNICALL Java_com_glumes_cppso_jnioperations_CacheFieldAndMethodOps_staticCacheField(JNIEnv *env, jobject instance, jobject animal) { static jfieldID fid = NULL; // 声明为 static 变量进行缓存 // 两种方法都行 // jclass cls = env->GetObjectClass(animal); jclass cls = env->FindClass("com/glumes/cppso/model/Animal"); jstring jstr; const char *c_str; // 从缓存中查找 if (fid == NULL) { fid = env->GetFieldID(cls, "name", "Ljava/lang/String;"); if (fid == NULL) { return; } } else { LOGD("field id is cached"); } jstr = (jstring) env->GetObjectField(animal, fid); c_str = env->GetStringUTFChars(jstr, NULL); if (c_str == NULL) { return; } env->ReleaseStringUTFChars(jstr, c_str); jstr = env->NewStringUTF("new name"); if (jstr == NULL) { return; } env->SetObjectField(animal, fid, jstr); }
通过声明为 static 变量进行缓存。但这种缓存方式显然有弊端,当多个调用者同时调用时,就会出现缓存多次的情况,并且每次调用时都要检查是否缓存过了。
初始化时缓存
在初始化时缓存,就是在类加载时,进行缓存。当类被加载进内存时,会先调用类的静态代码块,所以可以在类的静态代码块中进行缓存。
比如:
public class CacheFieldAndMethodOps extends BaseOperation { static { initCacheMethodId(); // 静态代码块中进行缓存 } private static native void initCacheMethodId(); }
在静态代码块中,可以将所需要的字段 id 或者方法 id 缓存成全局变量。
具体代码如下:
// 全局变量,作为缓存方法 id jmethodID InstanceMethodCache; // 初始化加载时缓存方法 id extern "C" JNIEXPORT void JNICALL Java_com_glumes_cppso_jnioperations_CacheFieldAndMethodOps_initCacheMethodId(JNIEnv *env, jclass type) { jclass cls = env->FindClass("com/glumes/cppso/model/Animal"); InstanceMethodCache = env->GetMethodID(cls, "getName", "()Ljava/lang/String;"); }
在 JNI 中直接将方法 id 缓存成全局变量了,这样再调用时,就不要再进行一次查找了,并且避免了多个线程同时调用会多次查找的情况。
extern "C" JNIEXPORT void JNICALL Java_com_glumes_cppso_jnioperations_CacheFieldAndMethodOps_callCacheMethod(JNIEnv *env, jobject instance, jobject animal) { jstring name = (jstring) env->CallObjectMethod(animal, InstanceMethodCache); const char *c_name = env->GetStringUTFChars(name, NULL); LOGD("call cache method and value is %s", c_name); }
感谢各位的阅读,以上就是“Android JNI调用时怎么缓存字段和ID”的内容了,经过本文的学习后,相信大家对Android JNI调用时怎么缓存字段和ID这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联网站建设公司,,小编将为大家推送更多相关知识点的文章,欢迎关注!