近期为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端类及其类变量的更多相关文章

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

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

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

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

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

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

  4. android NDK 实用学习(四)-类缓存

    1,为什么需要类缓存: 答:由于频繁的查找类及类成员变量需要很大的时间与空间开销,可参考如下文章: http://www.ibm.com/developerworks/cn/java/j-jni/ h ...

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

    随便谈谈为什么要Java调用C 吧: 我认为: 1.  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所以我们没必要同样的功能又在java中实现一遍.例如我之前做的一个项目 ...

  6. 基于 Android NDK 的学习之旅----- Java 方法映射到C中的签名

    刚接触JNI 的 兄弟在看一些demo的时候 发现有类似与“([Ljava/lang/String;)V”的东西的时候肯定会很“蛋疼”,完全不懂这是啥东西,怎么来的,有啥用处? 今天就讲讲这个“蛋疼” ...

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

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

  8. Android NDK开发之C调用Java及原生代码断点调试(二)

    上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...

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

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

随机推荐

  1. 【贪心】bzoj 3709:[PA2014]Bohater

    3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 653  Solved:  ...

  2. ASP + ACCESS 上传图片到数据库与将图片读出数据库显示之实现

    1.uppic.asp:上传图片程序 <% dim rs dim formsize,formdata,bncrlf,divider,datastart,dataend,mydata formsi ...

  3. openvas

    http://www.freebuf.com/articles/5474.html EPEL http://www.centoscn.com/CentOS/config/2014/0920/3793. ...

  4. java thread类和runable

    java thread 类其实和其他类是一样的.有自己的属性和方法.以及有一个重写的run方法 不同的是:必须重写run()方法. run()方法是线程thread启动后cpu调用运行的程序代码. r ...

  5. JNI和NDK的区别

    http://blog.csdn.net/ithomer/article/details/6828830 NDK(Native Development Kit)“原生”也就是二进制 android常用 ...

  6. 命令格式 kill -3 pid

    命令格式 kill -3 pid 作用 打印进程号为pid的进程中,每个线程的执行日志 到 nohup文件 中,如果nohup的输出做了重定向,那么输出到重定向以后的文件中. 命令格式 top -Hp ...

  7. Android UI-开源框架ImageLoader的完美例子

    Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...

  8. POJ3660——Cow Contest(Floyd+传递闭包)

    Cow Contest DescriptionN (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a prog ...

  9. LINUX ulimit命令

    概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段.ulimit 是一 ...

  10. OAF与Windows 7版本不兼容黑屏卡顿问题

    OAF版本比较原始,在Window7中无法应用配色方案,导致黑屏卡顿问题.(在启动OC4J后,Window7的配色方案还是会还原至原始状态) 修改$JDEV_HOME/jdev/bin/jdev.co ...