博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android NDK 实用学习(一)-获取java端类及其类变量
阅读量:6478 次
发布时间:2019-06-23

本文共 4064 字,大约阅读时间需要 13 分钟。

近期为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 stub21         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_JniDemo_testData(JNIEnv* env, jobject obj, jobject jobj) ;

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

1 JNIEXPORT jobject JNICALL Java_com_dasea_test_core_JniDemo_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"

 

转载于:https://www.cnblogs.com/dhf-0214/p/4612618.html

你可能感兴趣的文章
Shell编程-环境变量配置文件
查看>>
Struts2和Spring MVC的区别
查看>>
理解Javascript参数中的arguments对象
查看>>
git代码冲突
查看>>
git bash 风格调整
查看>>
linux操作系统加固软件,系统安全:教你Linux操作系统的安全加固
查看>>
linux中yum源安装dhcp,24.Linux系统下动态网络源部署方法(dhcpd)
查看>>
HDOJ-1010 Tempter of the Bone
查看>>
JavaNIO基础02-缓存区基础
查看>>
日本开设无人机专业,打造无人机“人才市场”
查看>>
190行代码实现mvvm模式
查看>>
兼容几乎所有浏览器的透明背景效果
查看>>
jeesite 框架搭建与配置
查看>>
Linux VNC server的安装及简单配置使用
查看>>
阿里宣布开源Weex ,亿级应用匠心打造跨平台移动开发工具
查看>>
Android项目——实现时间线程源码
查看>>
招商银行信用卡重要通知:消费提醒服务调整,300元以下消费不再逐笔发送短信...
查看>>
C#_delegate - 调用列表
查看>>
[转]Windows的批处理脚本
查看>>
多维数组元素的地址
查看>>