1,为什么需要类缓存:

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

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

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

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 stub
  21. 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. };

②定义对应类的变量:

  1. 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 reference
  20. env->DeleteLocalRef(jcSetDataMgr);
  21.  
  22. return true;
  23. }

④使用缓存的类及成员:

java端接口:

  1. 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, );
  19. env->SetByteField(jobj, gs_testSetDataMgr.jcData, );
  20.  
  21. DEBUG_OUT("Set field succ!");
  22.  
  23. char data[] = "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[] = {};
  31. for(int i = ; i < ; ++i){
  32. arrInt[i] = +i;
  33. }
  34. env->SetIntArrayRegion(jint_arr, , , arrInt);
  35.  
  36. DEBUG_OUT("testPreCache end!");
  37. }

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

  1. DEBUG_OUT("AllocObject object !");
  2. jmethodID initID = env->GetMethodID(gs_testGetDataMgr.jtestGetData, "<init>", "()V");
  3. 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. Matlab中bsxfun和unique函数解析

    一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...

  2. 【转载】test和cmp比较

    标 题:test和cmp一个很菜很基础的话题! 作 者: FTBirthday 时 间:2003/05/19 01:14am 链 接:http://bbs.pediy.com 看过破解教程,都知道te ...

  3. Akka的fault tolerant

    要想容错,该怎么办? 父actor首先要获知子actor的失败状态,然后确定该怎么办, “怎么办”这回事叫做“supervisorStrategy".   // Restart the st ...

  4. ???????????? no permissions

    1.一手鞋地址 google http://developer.android.com/tools/device.html 我处理的方法如下: 我的问题: android的版卡 在Ubuntu12.0 ...

  5. jquery的ajax向后台servlet传递json类型的多维数组

    后台运行结果:                                                                                      前台运行结果: ...

  6. MVC 的HTTP请求

    MVC 的HTTP请求过程(以IIS为例) 通过Browser发过请求给IIS(get/post) IIS得到请求后,再把请求转给aspnet_iisapi.dll处理,通过asp.net的一些框架的 ...

  7. 208. Implement Trie (Prefix Tree)

    题目: Implement a trie with insert, search, and startsWith methods. 链接: http://leetcode.com/problems/i ...

  8. MQ-传输方式Topic和Queue的对比

    Jms规范里的两种message传输方式Topic和Queue,两者的对比如下表():   Topic Queue 概要 Publish  Subscribe messaging 发布订阅消息 Poi ...

  9. The only legal comparisons are between two numbers, two strings, or two dates.

    The only legal comparisons are between two numbers, two strings, or two dates. Left  hand operand is ...

  10. 利用Merge Into 更新表,集合数据到数据库中

    使用Merge INTO 将表数据更新到数据库中 创建User-Defined Table Types   创建要更新的UserDetails表 创建更新存储过程 程序调用存储过程 查看结果