1,为什么需要类缓存:

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

http://www.ibm.com/developerworks/cn/java/j-jni/

http://www.28im.com/java/a2379737.html

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

 package com.dasea.test.core;
public class TestSetData {
// 主要是类ID和字段ID,方法ID的缓存
static {
OnNative();
} public native static void OnNative(); public boolean bData;
public double dData;
public int iData;
public byte cData;
public String sData;
public byte byteArr[]; public int intArr[]; public TestSetData() {
// TODO Auto-generated constructor stub
bData = true;
dData = 100.11;
iData = 333;
cData = 100;
sData = "20150204";
byteArr = new byte[10];
for (int i = 0; i < byteArr.length; i++) {
byteArr[i] = '2';
} intArr = new int[10];
for (int i = 0; i < intArr.length; i++) {
intArr[i] = i * 10;
}
}
}

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

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

 struct JTestSetData{
jclass jtestSetData; jfieldID jbData;
jfieldID jiData;
jfieldID jdData;
jfieldID jcData;
jfieldID jsData;
jfieldID jarrData;
};

②定义对应类的变量:

struct JTestSetData gs_testSetDataMgr;

③实现缓存函数:

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

④使用缓存的类及成员:

java端接口:

public native void testPreCacheFun(TestSetData obj);

c++端实现:

 JNIEXPORT void JNICALL Java_com_dasea_test_core_RTKNativeManager_testPreCacheFun(
JNIEnv* env, jobject obj, jobject jobj){
DEBUG_OUT("testPreCache start!"); if (NULL == gs_testSetDataMgr.jtestSetData) {
DEBUG_OUT("No cache class!");
if(false == InitTestSetData(env)){
DEBUG_OUT("Cache failed!");
return ;
}
DEBUG_OUT("Cache success!");
}else{
DEBUG_OUT("Has cache!");
} env->SetBooleanField(jobj, gs_testSetDataMgr.jbData, false);
env->SetDoubleField(jobj, gs_testSetDataMgr.jdData, 209.22);
env->SetIntField(jobj, gs_testSetDataMgr.jiData, );
env->SetByteField(jobj, gs_testSetDataMgr.jcData, ); DEBUG_OUT("Set field succ!"); char data[] = "jfkdsajfl";
jstring sss = env->NewStringUTF(data);
env->SetObjectField(jobj, gs_testSetDataMgr.jsData, sss);
env->DeleteLocalRef(sss); // 获取Java中数组属性arrays的对象
jintArray jint_arr = (jintArray)env->GetObjectField(jobj, gs_testSetDataMgr.jarrData);
int arrInt[] = {};
for(int i = ; i < ; ++i){
arrInt[i] = +i;
}
env->SetIntArrayRegion(jint_arr, , , arrInt); DEBUG_OUT("testPreCache end!");
}

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

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

android NDK 实用学习(四)-类缓存的更多相关文章

  1. android NDK 实用学习(三)- java端类对象的构造及使用

    1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...

  2. android NDK 实用学习(五)-c++端调用java接口

    1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...

  3. android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值

    1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值  env->SetBooleanF ...

  4. android NDK 实用学习(一)-获取java端类及其类变量

    近期为android 端项目包装一些c++代码,故学习ndk相关知识,现总结如下: 1,java与c++类型参照图: 2,此测试中使用的java类: package com.dasea.test.co ...

  5. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  6. 基于 Android NDK 的学习之旅-----环境搭建

    工欲善其事 必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环境搭建 Android开发环境搭建不是重点,相信看此文章的 ...

  7. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

  8. 基于 Android NDK 的学习之旅-----序言

    前些日子做了个Android项目, 引擎层 用C的, 准备写这个系类的文章,借此跟朋友来分享下我NDK开放的经验以及自己知识的总结和备忘.希望能给需要这方面资料的朋友提供一定的帮助. 主要涉及到:   ...

  9. 基于 Android NDK 的学习之旅----- C调用Java

    许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态 ...

随机推荐

  1. jquery.dragsort实现列表拖曳、排序

    在一次工作中需要将功能模块实现拖曳并且排序,并且将排序结果保存到数据库,用户下次登录后直接读取数据库排序信息进行显示.LZ找了好多插件,最后发现 jquery.dragsort 这款插件是最好使用的, ...

  2. The 7th Zhejiang Provincial Collegiate Programming Contest->Problem B:B - Somali Pirates

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3323 题意:去掉字符串里面的数字然后按输入顺序输出 #include< ...

  3. Eclipse 插件开发 —— 深入理解查找(Search)功能及其扩展点

    引言 查找功能是计算机语言开发环境 / 平台的一个非常重要的特性.Eclipse 也不例外,它提供了丰富的查找功能(用户可以输入正则表达式或任意字符串,指定查找范围和匹配选项等等),并且提供了简单易用 ...

  4. C#日期格式及其运算

    C#日期时间格式化 转载: http://www.cnblogs.com/hantianwei/archive/2010/09/23/1833228.html

  5. windows8 64位 IIS8 PHP5.5 安装 Imagemagick 组件

    为什么这里一定要说 windows 系统是64位呢,因为如果是系统是64位,那么PHP5.5 一般都会选择64的, Imagemagick 组件也会选择64位的, 但是操蛋的是 64位的Imagema ...

  6. Source Insight的应用技巧、宏功能

    目录 1 简介... 5 2 搭建我们的SI环境... 5 2.1 搭建步骤... 5 2.2 说明... 6 3 应用技巧... 6 3.1 初级应用技巧... 6 3.1.1 解决字体不等宽与对齐 ...

  7. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. Hbase二级索引

    http://blog.sina.com.cn/s/blog_4a1f59bf01018apd.html

  9. 中断服务程序不用interrupt关键字也可实现中断,该关键字是否必须?

    2013-06-20 11:13:35 中断服务程序不用interrupt关键字也可实现中断,该关键字是否必须? 使用tools->pin connect,将INT5与pin.txt关联,模拟外 ...

  10. JavaScript DOM高级程序设计2.1创建可重用的对象--我要坚持到底!

    1.对象中包含什么 在javascript中,从函数到字符串实际上都是对象 继承 //创建一个person对象的实例 var penson={}; person.getName=function(){ ...