android NDK 实用学习(一)-获取java端类及其类变量
近期为android 端项目包装一些c++代码,故学习ndk相关知识,现总结如下:
1,java与c++类型参照图:
2,此测试中使用的java类:
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,使用类接口定义:
①java端:
public native TestSetData testData(TestSetData obj);
②c++端:
JNIEXPORT jobject JNICALL Java_com_dasea_test_core_JniDemo_testData(JNIEnv* env, jobject obj, jobject jobj) ;
4,完整c++端接口实现:
JNIEXPORT jobject JNICALL Java_com_dasea_test_core_JniDemo_testData(JNIEnv* env, jobject obj, jobject jobj){
DEBUG_OUT("test set data start"); jclass jcSetDataMgr = env->FindClass("com/dasea/test/core/TestSetData");
if(NULL == jcSetDataMgr){
DEBUG_OUT("Not find class!");
return NULL;
}
DEBUG_OUT("Find class succ!"); jfieldID jfbdata = env->GetFieldID(jcSetDataMgr, "bData", "Z");
if(NULL == jfbdata){
DEBUG_OUT("jfbdata fail!");
}
jfieldID jfddata = env->GetFieldID(jcSetDataMgr, "dData", "D");
if(NULL == jfbdata){
DEBUG_OUT("jfddata fail!");
}
jfieldID jfidata = env->GetFieldID(jcSetDataMgr, "iData", "I");
if(NULL == jfbdata){
DEBUG_OUT("jfidata fail!");
}
jfieldID jfcdata = env->GetFieldID(jcSetDataMgr, "cData", "B");
if(NULL == jfbdata){
DEBUG_OUT("jfcdata fail!");
}
jfieldID jfsdata = env->GetFieldID(jcSetDataMgr, "sData", "Ljava/lang/String;");
if(NULL == jfbdata){
DEBUG_OUT("jfsdata fail!");
} DEBUG_OUT("Get end!"); env->SetBooleanField(jobj, jfbdata, false);
DEBUG_OUT("SetBooleanField end!"); env->SetDoubleField(jobj, jfddata, 209.22);
DEBUG_OUT("SetDoubleField end!"); env->SetIntField(jobj, jfidata, );
DEBUG_OUT("SetIntField end!"); env->SetByteField(jobj, jfcdata, );
DEBUG_OUT("Set field succ!"); char data[] = "";
env->SetObjectField(jobj, jfsdata, env->NewStringUTF(data)); jfieldID jiarr = env->GetFieldID(jcSetDataMgr, "intArr", "[I");
if(NULL == jiarr){
DEBUG_OUT("jfbdata fail!");
} // 获取Java中数组属性arrays的对象
jintArray jint_arr = (jintArray)env->GetObjectField(jobj, jiarr); int arrInt[] = {};
for(int i = ; i < ; ++i){
arrInt[i] = +i;
}
env->SetIntArrayRegion(jint_arr, , , arrInt); jfieldID jbyteArr = env->GetFieldID(jcSetDataMgr, "byteArr", "[B");
char arrByte[] = "";
jbyteArray jbyte_arr = (jbyteArray)env->GetObjectField(jobj, jbyteArr);
env->SetByteArrayRegion(jbyte_arr, , , (const signed char*)arrByte); DEBUG_OUT("test set data end!"); return NULL;
}
5,单独讲解:
①查找java类:
jclass jcSetDataMgr = env->FindClass("com/dasea/test/core/TestSetData");
②查找类成员变量:
jfieldID jfbdata = env->GetFieldID(jcSetDataMgr, "bData", "Z");
jfieldID jfddata = env->GetFieldID(jcSetDataMgr, "dData", "D");
jfieldID jfidata = env->GetFieldID(jcSetDataMgr, "iData", "I");
jfieldID jfcdata = env->GetFieldID(jcSetDataMgr, "cData", "B");
jfieldID jfsdata = env->GetFieldID(jcSetDataMgr, "sData", "Ljava/lang/String;");
jfieldID jbyteArr = env->GetFieldID(jcSetDataMgr, "byteArr", "[B"
android NDK 实用学习(一)-获取java端类及其类变量的更多相关文章
- android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值
1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值 env->SetBooleanF ...
- android NDK 实用学习(五)-c++端调用java接口
1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...
- android NDK 实用学习(三)- java端类对象的构造及使用
1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ...
- android NDK 实用学习(四)-类缓存
1,为什么需要类缓存: 答:由于频繁的查找类及类成员变量需要很大的时间与空间开销,可参考如下文章: http://www.ibm.com/developerworks/cn/java/j-jni/ h ...
- 基于 Android NDK 的学习之旅-----Java 调用C
随便谈谈为什么要Java调用C 吧: 我认为: 1. 有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所以我们没必要同样的功能又在java中实现一遍.例如我之前做的一个项目 ...
- 基于 Android NDK 的学习之旅----- Java 方法映射到C中的签名
刚接触JNI 的 兄弟在看一些demo的时候 发现有类似与“([Ljava/lang/String;)V”的东西的时候肯定会很“蛋疼”,完全不懂这是啥东西,怎么来的,有啥用处? 今天就讲讲这个“蛋疼” ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- Android NDK开发之C调用Java及原生代码断点调试(二)
上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...
- 基于 Android NDK 的学习之旅-----环境搭建
工欲善其事 必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环境搭建 Android开发环境搭建不是重点,相信看此文章的 ...
随机推荐
- Java在mysql插入数据的时候的乱码问题解决
今天在使用hibernate的时候,插入mysql的数据中的中文总是显示乱码,之前出现过类似的问题,但是没有太在意,今天又发生了.所以向彻底的解决一下. 参考的博文: http://www.cnblo ...
- [转载]再谈iframe自适应高度
Demo页面:主页面 iframe_a.html ,被包含页面 iframe_b.htm 和 iframe_c.html 下面开始讲: 通过Google搜索iframe 自适应高度,结果5W多条,搜索 ...
- PAT-乙级-1033. 旧键盘打字(20)
1033. 旧键盘打字(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 旧键盘上坏了几个键,于是在敲一段文 ...
- 大象的崛起!Hadoop七年发展风雨录
http://www.open-open.com/news/view/a22597 在互联网这个领域一直有这样的说法:“如果老二无法战胜老大,那么就把老大赖以生存的东西开源吧”.当年Yahoo!与Go ...
- 如何在WINDOWS下编译BOOST C++库 .
如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25 写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0. 1)下载boost ...
- MVC开发过程中的疑难杂症
MVC使用客户端验证 <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type=& ...
- struts2总结五: Strut2 访问Servlet API
一.间接访问 public String execute() throws Exception { this.message="hello,this is put into applicat ...
- mybatis怎样配置数据库集群
场景:一个读数据源一个读写数据源. 原理:借助spring的[org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource] ...
- linux下添加PATH环境变量
添加PATH环境变量,第1种方法:[root@lx_web_s1 ~]# export PATH=/usr/local/webserver/mysql/bin:$PATH 再次查看: [root@lx ...
- 分布式环境下的id生成方法
分布式环境下的id生成方法 前几天研究数据库分表分库的问题,其中有一个关键的地方就是生成唯一键的问题,假如数据表有1亿条数据,而且还在不断的增加,这里我们就需要考虑到分表分库,假设我们采用Hash ...