android NDK 实用学习(四)-类缓存
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 实用学习(四)-类缓存的更多相关文章
- android NDK 实用学习(三)- java端类对象的构造及使用
1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...
- android NDK 实用学习(五)-c++端调用java接口
1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...
- android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值
1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值 env->SetBooleanF ...
- android NDK 实用学习(一)-获取java端类及其类变量
近期为android 端项目包装一些c++代码,故学习ndk相关知识,现总结如下: 1,java与c++类型参照图: 2,此测试中使用的java类: package com.dasea.test.co ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- 基于 Android NDK 的学习之旅-----环境搭建
工欲善其事 必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环境搭建 Android开发环境搭建不是重点,相信看此文章的 ...
- Android NDK 开发(四)java传递数据到C【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...
- 基于 Android NDK 的学习之旅-----序言
前些日子做了个Android项目, 引擎层 用C的, 准备写这个系类的文章,借此跟朋友来分享下我NDK开放的经验以及自己知识的总结和备忘.希望能给需要这方面资料的朋友提供一定的帮助. 主要涉及到: ...
- 基于 Android NDK 的学习之旅----- C调用Java
许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态 ...
随机推荐
- 浅谈Javascript 数组与字典
Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法. var a = new Array(); a[0] = "Acer&q ...
- maven添加jar包依赖
maven的东西使用了一段时间,但是每次使用都多少有点含糊,所以总结一下. 目前主要使用是在jar包的控制上 原理: 在本地,指定一个文件夹,便是maven的仓库,maven会从远程的中央仓库中下载你 ...
- PAT-乙级-1015. 德才论 (25)
1015. 德才论 (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Li 宋代史学家司马光在<资治通鉴&g ...
- Flask, Tornado, GEvent, 以及它们的结合的性能比较
Flask, Tornado, GEvent, 以及它们的结合的性能比较 英文: http://blog.wensheng.com/2011/10/performance-of-flask-torna ...
- linux ubuntu删除引导 grub出现错误解决方案
使用u盘启动PE系统 找到diskgenius软件,点击: 硬盘->重建主引导记录
- Linux中的栈:用户态栈/内核栈/中断栈
http://blog.chinaunix.net/uid-14528823-id-4136760.html Linux中有多种栈,很容易弄晕,简单说明一下: 1.用户态栈:在进程用户态地址空间底部, ...
- GridBagLayout:网格包布局管理器
GridBagLayout:网格包布局管理器 GridBagLayout可以说是布局管理器Layout中最复杂的一个,其中涉及到的参数也比较得多,比如说: GridBagConstraints g ...
- Oracle程序包
程序包由两部分构成:规范(specification)和主体(body). 创建表 create table PEOPLE ( ID NUMBER primary key not null, NAME ...
- POJ1942——Paths on a Grid(组合数学)
Paths on a Grid DescriptionImagine you are attending your math lesson at school. Once again, you are ...
- P114、面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增顺序的.struct ListNode{ int m_nKey; ListNode* m_p ...