博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android NDK 实用学习(四)-类缓存
阅读量:6081 次
发布时间:2019-06-20

本文共 4125 字,大约阅读时间需要 13 分钟。

1,为什么需要类缓存:

答:由于频繁的查找类及类成员变量需要很大的时间与空间开销,可参考如下文章:

2,缓存时需要在java类使用static,如下:

1 package com.dasea.test.core; 2 public class TestSetData { 3     // 主要是类ID和字段ID,方法ID的缓存 4     static { 5         OnNative(); 6     } 7  8     public native static void OnNative(); 9 10     public boolean bData;11     public double  dData;12     public int     iData;13     public byte    cData;14     public String  sData;15     public byte    byteArr[];16 17     public int     intArr[];18 19     public TestSetData() {20         // TODO Auto-generated constructor stub21         bData = true;22         dData = 100.11;23         iData = 333;24         cData = 100;25         sData = "20150204";26         byteArr = new byte[10];27         for (int i = 0; i < byteArr.length; i++) {28             byteArr[i] = '2';29         }30 31         intArr = new int[10];32         for (int i = 0; i < intArr.length; i++) {33             intArr[i] = i * 10;34         }35     }36 }

3,c++端的相关实现代码:

①定义一个对应的结构体:

1 struct JTestSetData{ 2     jclass   jtestSetData; 3  4     jfieldID jbData; 5     jfieldID jiData; 6     jfieldID jdData; 7     jfieldID jcData; 8     jfieldID jsData; 9     jfieldID jarrData;10 };

②定义对应类的变量:

struct JTestSetData gs_testSetDataMgr;

③实现缓存函数:

1 JNIEXPORT void JNICALL Java_com_dasea_test_core_TestSetData_OnNative(2         JNIEnv* env, jobject obj){3     DEBUG_OUT("TestSetData native start!");4 5     InitTestSetData(env);6 7     DEBUG_OUT("TestSetData native end!");8 }
1 bool InitTestSetData(JNIEnv* env){ 2     // 缓存类及其字段 3     // 查找类里面的字段,并进行赋值 4  5     // STEP 1/3 : Load the class id 6     jclass jcSetDataMgr = env->FindClass("com/kq/rtk/core/TestSetData"); 7  8     // STEP 2/3 : Assign the ClassId as a Global Reference 9     gs_testSetDataMgr.jtestSetData = (jclass) env->NewGlobalRef(jcSetDataMgr);10 11     jfieldID funB = env->GetFieldID(jcSetDataMgr, "bData", "Z");12     gs_testSetDataMgr.jbData = funB;13     gs_testSetDataMgr.jiData = env->GetFieldID(jcSetDataMgr, "iData", "I");14     gs_testSetDataMgr.jdData = env->GetFieldID(jcSetDataMgr, "dData", "D");15     gs_testSetDataMgr.jcData = env->GetFieldID(jcSetDataMgr, "cData", "B");16     gs_testSetDataMgr.jsData = env->GetFieldID(jcSetDataMgr, "sData", "Ljava/lang/String;");17     gs_testSetDataMgr.jarrData = env->GetFieldID(jcSetDataMgr, "intArr", "[I");18 19     // STEP 3/3 : Delete the no longer needed local reference20     env->DeleteLocalRef(jcSetDataMgr);21 22     return true;23 }

④使用缓存的类及成员:

java端接口:

public native void testPreCacheFun(TestSetData obj);

c++端实现:

1 JNIEXPORT void JNICALL Java_com_dasea_test_core_RTKNativeManager_testPreCacheFun( 2         JNIEnv* env, jobject obj, jobject jobj){ 3     DEBUG_OUT("testPreCache start!"); 4  5     if (NULL == gs_testSetDataMgr.jtestSetData) { 6         DEBUG_OUT("No cache class!"); 7         if(false == InitTestSetData(env)){ 8             DEBUG_OUT("Cache failed!"); 9             return ;10         }11         DEBUG_OUT("Cache success!");12     }else{13         DEBUG_OUT("Has cache!");14     }15 16     env->SetBooleanField(jobj, gs_testSetDataMgr.jbData, false);17     env->SetDoubleField(jobj, gs_testSetDataMgr.jdData, 209.22);18     env->SetIntField(jobj, gs_testSetDataMgr.jiData, 3653);19     env->SetByteField(jobj, gs_testSetDataMgr.jcData, 67);20 21     DEBUG_OUT("Set field succ!");22 23     char data[10] = "jfkdsajfl";24     jstring sss = env->NewStringUTF(data);25     env->SetObjectField(jobj, gs_testSetDataMgr.jsData, sss);26     env->DeleteLocalRef(sss);27 28     // 获取Java中数组属性arrays的对象29     jintArray jint_arr = (jintArray)env->GetObjectField(jobj, gs_testSetDataMgr.jarrData);30     int arrInt[10] = {
0};31 for(int i = 0; i < 10; ++i){32 arrInt[i] = 300+i;33 }34 env->SetIntArrayRegion(jint_arr, 0, 10, arrInt);35 36 DEBUG_OUT("testPreCache end!");37 }

⑤使用缓存类构造类对象:

1      DEBUG_OUT("AllocObject object !");2      jmethodID initID = env->GetMethodID(gs_testGetDataMgr.jtestGetData, "
", "()V");3 jobject jresult = env->NewObject(gs_testGetDataMgr.jtestGetData, initID);

 

转载于:https://www.cnblogs.com/dhf-0214/p/4612882.html

你可能感兴趣的文章
浏览器保存网页的四种方式
查看>>
Springboot整合mybatis并配置redis缓存
查看>>
博客迁移
查看>>
Linux 如何写makefile文件
查看>>
android 虚拟机中sd卡应用
查看>>
eclipse 快速建立PHP调试环境
查看>>
数据结构与算法-列表、栈、队列
查看>>
nodejs的安装和环境搭建
查看>>
HTML5 Canvas 学习日志(七)
查看>>
如何把Windows,Linux和macOS的动态链接库封装到一个Java Jar包中
查看>>
JVM内存模型和JVM参数的关系
查看>>
iOS按钮倒计时在进入后台不继续计时的处理
查看>>
logback 配置详解(一)
查看>>
Java8新特性:函数式编程
查看>>
【语法拾零】方法内部类所访问的局部变量为什么必须是final的?
查看>>
Android studio使用心得(二)--- 打包签名apk发布
查看>>
vi 编辑器的用法
查看>>
Android开发学习笔记(五):Starting an Activity
查看>>
xcode cocos2sx make
查看>>
SQL SERVER数据库服务器排序规则修改
查看>>