Android JNI调用时怎么缓存字段和ID
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"Android JNI调用时怎么缓存字段和ID",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android JNI调用时怎么缓存字
千家信息网最后更新 2026年11月01日Android JNI调用时怎么缓存字段和ID
这篇文章主要讲解了"Android JNI调用时怎么缓存字段和ID",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android JNI调用时怎么缓存字段和ID"吧!
使用时缓存
使用时缓存,就是在调用时查找一次,然后将它缓存成 static 变量,这样下次调用时就已经被初始化过了。
直到内存释放了,才会缓存失效。
extern "C"JNIEXPORT void JNICALLJava_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 缓存成全局变量。
具体代码如下:
// 全局变量,作为缓存方法 idjmethodID InstanceMethodCache;// 初始化加载时缓存方法 idextern "C"JNIEXPORT void JNICALLJava_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 JNICALLJava_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这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
缓存
变量
字段
代码
方法
静态
就是
情况
学习
内存
内容
同时
多个
全局
弊端
思路
文章
方式
更多
用者
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网与科技
互联网新科技
北京路客互联网科技有限公司
互联网科技工作委员会毛军
河南真二互联网科技有限公司
盈实互联网科技
互联网科技的发展
金融科技与互联网金融
西安互联网科技公司
广州紫鲸互联网科技
深圳艾佳互联网科技
科技伦理 互联网公司
北京三清互联网科技
亳州好赞互联网科技有限公司
高科技互联网发展前景如何
朱啸虎曾投资哪些互联网科技企业
皮皮虾互联网科技有限公司
中国科技和美国互联网
数字科技和互联网金融哪个好
安徽九吞吴互联网科技有限公司
新华互联网科技
广州万易互联网科技有限公司
互联网与科技金融数据
互联网科技金融
上海互联网科技有限公司
互联网科技创新企业排名
互联网科技教育视频
长沙互联网科技
小米互联网科技园入驻
雨阳互联网卡科技有限公司