android NDK 实用学习-获取java端类及其类变量

近期为android 端项目包装一些c++代码,故学习ndk相关知识,现总结如下:

1,java与c++类型参照图:

2,此测试中使用的java类:

 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,使用类接口定义:

①java端:

  public native TestSetData testData(TestSetData obj);

②c++端:

   JNIEXPORT jobject JNICALL Java_com_dasea_test_core_RTKNativeManager_testData(JNIEnv* env, jobject obj, jobject jobj) ;

4,完整c++端接口实现:

 1 JNIEXPORT jobject JNICALL Java_com_dasea_test_core_RTKNativeManager_testData(JNIEnv* env, jobject obj, jobject jobj){
 2     DEBUG_OUT("test set data start");
 3
 4     jclass jcSetDataMgr = env->FindClass("com/dasea/test/core/TestSetData");
 5     if(NULL == jcSetDataMgr){
 6         DEBUG_OUT("Not find class!");
 7         return NULL;
 8     }
 9     DEBUG_OUT("Find class succ!");
10
11     jfieldID jfbdata = env->GetFieldID(jcSetDataMgr, "bData", "Z");
12     if(NULL == jfbdata){
13         DEBUG_OUT("jfbdata fail!");
14     }
15     jfieldID jfddata = env->GetFieldID(jcSetDataMgr, "dData", "D");
16     if(NULL == jfbdata){
17         DEBUG_OUT("jfddata fail!");
18     }
19     jfieldID jfidata = env->GetFieldID(jcSetDataMgr, "iData", "I");
20     if(NULL == jfbdata){
21         DEBUG_OUT("jfidata fail!");
22     }
23     jfieldID jfcdata = env->GetFieldID(jcSetDataMgr, "cData", "B");
24     if(NULL == jfbdata){
25         DEBUG_OUT("jfcdata fail!");
26     }
27     jfieldID jfsdata = env->GetFieldID(jcSetDataMgr, "sData", "Ljava/lang/String;");
28     if(NULL == jfbdata){
29         DEBUG_OUT("jfsdata fail!");
30     }
31
32     DEBUG_OUT("Get end!");
33
34     env->SetBooleanField(jobj, jfbdata, false);
35     DEBUG_OUT("SetBooleanField end!");
36
37     env->SetDoubleField(jobj, jfddata, 209.22);
38     DEBUG_OUT("SetDoubleField end!");
39
40     env->SetIntField(jobj, jfidata, 3653);
41     DEBUG_OUT("SetIntField end!");
42
43     env->SetByteField(jobj, jfcdata, 67);
44     DEBUG_OUT("Set field succ!");
45
46     char data[10] = "4611354";
47     env->SetObjectField(jobj, jfsdata, env->NewStringUTF(data));
48
49     jfieldID jiarr = env->GetFieldID(jcSetDataMgr, "intArr", "[I");
50     if(NULL == jiarr){
51         DEBUG_OUT("jfbdata fail!");
52     }
53
54     // 获取Java中数组属性arrays的对象
55     jintArray jint_arr = (jintArray)env->GetObjectField(jobj, jiarr);
56
57     int arrInt[10] = {0};
58     for(int i = 0; i < 10; ++i){
59        arrInt[i] = 220+i;
60     }
61     env->SetIntArrayRegion(jint_arr, 0, 10, arrInt);
62
63     jfieldID jbyteArr = env->GetFieldID(jcSetDataMgr, "byteArr", "[B");
64     char arrByte[10] = "20200825";
65     jbyteArray jbyte_arr = (jbyteArray)env->GetObjectField(jobj, jbyteArr);
66     env->SetByteArrayRegion(jbyte_arr, 0, 8, (const signed char*)arrByte);
67
68     DEBUG_OUT("test set data end!");
69
70     return NULL;
71 }

5,单独讲解:

①查找java类:

jclass jcSetDataMgr = env->FindClass("com/dasea/test/core/TestSetData");

②查找类成员变量:

1 jfieldID jfbdata = env->GetFieldID(jcSetDataMgr, "bData", "Z");
2 jfieldID jfddata = env->GetFieldID(jcSetDataMgr, "dData", "D");
3 jfieldID jfidata = env->GetFieldID(jcSetDataMgr, "iData", "I");
4 jfieldID jfcdata = env->GetFieldID(jcSetDataMgr, "cData", "B");
5 jfieldID jfsdata = env->GetFieldID(jcSetDataMgr, "sData", "Ljava/lang/String;");
6 jfieldID jbyteArr = env->GetFieldID(jcSetDataMgr, "byteArr", "[B"
时间: 2024-10-17 13:38:24

android NDK 实用学习-获取java端类及其类变量的相关文章

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

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

android NDK 实用学习-java端对象成员赋值和获取对象成员值

1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值  env->SetBooleanField(jobj, jfbdata, false); 对double类型成员进行赋值 env->SetDoubleField(jobj, jfddata, 209.22); 对int类型成员进行赋值 env->SetIntField(jobj, jfidata, 3653); 对byte类型成员

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

1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ①首先获取类; ②获取类的无参构造函数: jmethodID initID = env->GetMethodID(jcSetDataMgr, "<init>", "()V"); ③构造类实例: jobject jresult = env->New

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

1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 android NDK 实用学习(三)- java端类对象的构造及使用 android NDK 实用学习(四)-类缓存 2,java端类接口定义: 1 public class RTKNativeManager { 2 // 其他接口 3 4 // 开给c++端的接口 5 public static

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

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

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

原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码) 基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String 字符串传输 a)         上层定义一个native的方法

基于 Android NDK 的学习之旅-----序言

http://www.cnblogs.com/luxiaofeng54/tag/android/default.html?page=1 基于 Android NDK 的学习之旅-----目录 duicky 2011-09-15 16:34 阅读:3035 评论:2 基于 Android NDK 的学习之旅-----资源释放 duicky 2011-08-21 14:29 阅读:6173 评论:0 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码) duicky

Android NDK开发学习教程(一)JNI语法

一.对照表 Java类型    本地类型         描述 boolean    jboolean       C/C++8位整型 byte       jbyte          C/C++带符号的8位整型 char       jchar          C/C++无符号的16位整型 short      jshort         C/C++带符号的16位整型 int        jint           C/C++带符号的32位整型 long       jlong  

学习笔记——Java数字处理类

1.数字格式化 使用Java.text.DecimalFormat格式化数字,一般使用其中的DecimalFormat类.如: import java.text.DecimalFormat; public class DecimalFormatdemo{ static public void simpleformat(String pattern,double value){ DecimalFormat myformat=new DecimalFormat(pattern); String ou