Android JNI调用时怎么缓存字段和ID
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要讲解了"Android JNI调用时怎么缓存字段和ID",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android JNI调用时怎么缓存字
千家信息网最后更新 2025年01月20日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安全错误
数据库的锁怎样保障安全
优酷的服务器
新乡市网络安全周
图片bolb存到数据库
中国支付宝中国网络技术有限公司
手机上打开数据库文件是空的
各种数据库市场占比
网络安全宣传培训总结报告
网络安全法规及标准
魔兽数据库技术提取
义乌奋斗猫网络技术有限公司
二手笔记本软件开发
软件开发哪个业务方向比较好
windows服务器安全组设置
app系统软件开发服务咨询
海南常规软件开发价格表
城阳区ios软件开发外包公司
服务器组成部分
畅想软件开发
皆知云网络技术
数据库两表联查 怎么 写
数据库怎么查询员工年龄
国际服更新的服务器在哪里
直播软件开发市场
软件开发文科生可以做吗
网络技术和城市管理
江苏智铭网络技术地址
aftv服务器链接失败怎么办
电信网络技术视频教程
cdn服务器有哪些
10台服务器能压多大的量