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. LDPY Ghost Win7 64位 纯净自选版 V5.0

    ★ 概述: ☆ 源安装盘是[Windows7_SP1_ULTIMATE]微软官方SP1正式版. ☆ 破解激活WIN7,补丁更新至2013/06/18所有系统安全关键补丁. ☆ 破解 Windows 7 ...

  2. Samza的ApplicationMaster

    当Samza ApplicationMaster启动时,它做以下的事情: 通过STREAMING_CONFIG环境变量从YARN获取配置信息(configuration) 在随机端口上 启动一个JMX ...

  3. Hex string convert to integer with stringstream

    #include <sstream>#include <iostream>int main() { unsigned int x; std::stringstream ss; ...

  4. 深入理解计算机各种类型大小(sizeof)

    深入理解计算机各种类型大小(sizeof)   // Example of the sizeof keyword size_t  i = sizeof( int ); struct align_dep ...

  5. 如何提高多线程程序的cpu利用率

    正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情.在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行.然后,事情确 ...

  6. POJ1905Expanding Rods(二分)

    http://poj.org/problem?id=1905 题意 :在两堵实心墙中间有一根杆,长度为L,然后给它加热,温度是n,则两墙之间的杆会弯曲,长度会变为L'=(1+n*C)*L,求前后两个状 ...

  7. CodeForces 299B Ksusha the Squirrel

    http://codeforces.com/problemset/problem/299/B 题意 :这个题挺简单的,就是说这个姑娘不喜欢走有石头的扇形,所以给你一个k的值,代表她一次可以跳多少扇形. ...

  8. 利用link标签rel="alternate stylesheet"属性实现界面动态换肤

    rel="stylesheet"属性指定将一个样式表立即应用到文档.rel="alternate stylesheet"属性将其作为备用样式表而在默认情况下禁用 ...

  9. SaaS系列介绍之二: SaaS介绍

    1 引言 横看成岭侧成峰,远近高低各不同. 不识庐山真面目, 只缘身在此山中.                                                  ________苏轼, ...

  10. eay ui iframe 下常问题

    背景:客户要使用https进行登录,把原来的登录做到一个小框,用iframe嵌进来进行登录. 客户拥有4个域名,但只在xxx.com域名中购买了安全证书,所以多个域名下登录所用的iframe中src是 ...