说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android JNI实例代码(一)

HTML文档下载 WORD文档下载 PDF文档下载
Android JNI实例代码(一)

作者:Android开发网


  前几天Android123有关Android JNI开发系列教程中有关的源代码,可以在本文中查找:

一、 在JNI中执行Java方法

class AndroidJniDemo {
 private native void executeMethod();
 private void show() {
  System.out.println("Java cwj print"); //执行了show方法后打印java层的输出
 }
 public static void main(String args[]) {  //这里我们在J2SE中测试,Android开发者可以放到Activity中的onCreate调用
  AndroidJniDemo ajd = new AndroidJniDemo();
  ajd.executeMethod(); 
 }
 static {
  System.loadLibrary("AndroidJniDemo");
 }
}

下面是JNI代码:

JNIEXPORT void JNICALL
Java_AndroidJniDemo_executeMethod(JNIEnv *env, jobject obj)
{
 jclass clazz = (*env)->GetObjectClass(env, obj); //通过类的对象
 jmethodID mid = (*env)->GetMethodID(env, clazz, "show", "()V"); //查找java中的show方法的ID,最后的签名符号为void类型
 if (mid == NULL) {
  return;   //如果方法ID没有找到
 }

 printf("JNI cwj print"); //从JNI中打印输出

 (*env)->CallVoidMethod(env, obj, mid); //执行show方法
}

二、获取/设置类的域或者说属性字段

 (1 String类型的属性读写

class AndroidJniDemo2 {
 private String sTmp;
 private native void readwriteField();
 public static void main(String args[]) {
  AndroidJniDemo2 ajd2 = new AndroidJniDemo2();
  ajd2.sTmp = "cwj";
  ajd2.readwriteField();
  System.out.println("Java cwj print ="+ajd2.sTmp);  //java层打印结果
 
 }
 static {
  System.loadLibrary("AndroidJniDemo2");
 }
}

下面是JNI层代码:
 
JNIEXPORT void JNICALL
Java_AndroidJniDemo2_readwriteField(JNIEnv *env, jobject obj)
{
 jfieldID fid;
 jstring jstr;
 const char *szTemp;
 
 jclass clazz = (*env)->GetObjectClass(env, obj); 
  
 fid = (*env)->GetFieldID(env, clazz, "sTmp", "Ljava/lang/String;"); // 注意sTmp是Java中声明的,String类型在java.lang.String包中,签名符号的格式注意
 if (fid == NULL) {
  return;
 }
 
 jstr = (*env)->GetObjectField(env, obj, fid);  //Java的String类型,要用GetObjectField函数获取,这里Android123提示大家没有GetStringField这样的函数在JNI中,或者说在C语言中
 szTemp = (*env)->GetStringUTFChars(env, jstr, NULL); //因为还需要赋值,在C中我们转换为utf8的类型。
 if (szTemp == NULL) {
  return;
 }

 printf("JNI cwj print=%s", szTemp); //先打印Java层传进来的值

 (*env)->ReleaseStringUTFChars(env, jstr, szTemp); //szTemp打印完不用了要及时释放掉
 
 jstr = (*env)->NewStringUTF(env, "android123"); //返新的字段值,供Java层打印
 if (jstr == NULL) {
  return; 
 }
 (*env)->SetObjectField(env, obj, fid, jstr); //设置新的属性值。
}

  (2 int或double类似的类型的属性读写,本例同时属性值是一个静态的定义,注意下面加粗的static关键字

class AndroidJniDemo3 {
 private static int sAge;
 private native void readwriteField();
 public static void main(String args[]) {
  AndroidJniDemo3 ajd3 = new AndroidJniDemo3();
  AndroidJniDemo3.sAge = 23;
  ajd3.readwriteField(); //执行jni层
  System.out.println("Java cwj print="+sAge); //java层打印新的值,应该为120
 }
 static {
  System.loadLibrary("AndroidJniDemo3");
 }
}

JNIEXPORT void JNICALL
Java_AndroidJniDemo3_readwriteField(JNIEnv *env, jobject obj)
{
 jfieldID fid;
 jint nTemp;

 jclass clazz = (*env)->GetObjectClass(env, obj);

 fid = (*env)->GetStaticFieldID(env, clazz, "sAge", "I"); //因为是整形,这里签名符号为I,注意使用的函数中包含Static代表是一个静态的属性
 if (fid == NULL) {
  return;
 }

 nTemp = (*env)->GetStaticIntField(env, clazz, fid);
 printf("JNI cwj print=%d", nTemp); //这里应该显示23
 (*env)->SetStaticIntField(env, clazz, fid, 120); //设置新的值为120,注意包含了Static,java层中定义的sAge是静态的。
}

 今天Android开发网给出了较完整的JNI下执行Java的源代码第一部分,有关第二部分可以查看 Android JNI实例代码(二)

提升Sketch使用效率的6个实用技巧 界面设计原则之一篇:权衡优先级 突出焦点 划分好内容层级 开源的ResearchKit:苹果将如何颠覆未来医疗? CocoaPods 0.36正式发布,实现Swift和iOS 8动态框架支持 C++入门学习书籍推荐 GitHub是如何征服Google、微软和其它公司的 约见越狱大神!2015 MSS移动安全峰会议程披露 Spark 1.3更新概述:176个贡献者,1000+ patches 从游戏设计到星际探险,微软HoloLens全息技术将改变什么? 触摸屏技术未来?详解Apple新手段Force Touch 专访云适配CEO陈本峰:紧跟HTML5热潮,Web组件化知多少? QQ音乐5.0全新设计过程要点解析 GDC 2015感悟:从0到1,VR投入手游开发路漫漫 TestBird发布手游真人众测平台——附中国手游兼容性测试白皮书 与用户的再一次连接,微软的免费升级计划背后 颠覆App!LayaBox用Flash开发重度HTML5游戏 WinHEC:微软小娜与小冰正式登陆Windows 10平台 Coursera工程师董飞:典型硅谷公司大数据实战分析 微软开源Visual Studio构建工具MSBuild 死而复生!下架6月,Launcher重回App Store 虚拟投影、高保真耳机!新型可穿戴家庭影院Dashbon Mask 【程序员电子刊精选】躺枪的互联网思维 Algolia的分布式搜索网络架构 对抗苹果?豪雅联合Google、Intel开发智能奢表 VR产品技术解析之三星Gear VR 雅虎北研即将关闭 人才抢夺战迅速拉响 移动应用中的AR开发,5款最受欢迎工具推荐! 中国黑客Pwn2Own再创佳绩 Keen Team三年五夺魁 星环CTO孙元浩:技术解析Transwarp Inceptor是怎样炼成的 第七届中国云计算大会将于6月3-5日在北京召开 两大设计模式 塑造高可读性的网页布局 sos!Help me! 有谁知道怎样用Capwnd控件(用于捕获视频的控件)?? 请帮我看看,谢了 请问如何控制imagecombo控件的下拉高度呢? 能告诉我什么是回调函数吗?注册的系统回调函数中引入的参数能在别的地方得到吗? 在RicheEdit里的字体颜色都是黑色,能变成其他颜色吗? 请问在视中如何使主框架的某个菜单项变为不可用(代码如下,错在什么地方,如何改?)! 请教VFP中GRID的显示和取值问题 请教一些有关用ROSE进行UML设计的问题 高薪寻找合作者:医院信息管理系统 求救!!!!为什么必须多按reset键才可以启动?? 請教: WideString如何存入數據庫image字段? 如何判断一个字符串是数字串?要源码(无内容) 登陆某些网站后浏览器的默认主页不能更改,怎么办???谢谢 请教简单的API函数的问题 ! 简单问题,怎么样得到下拉列表的选项?????最好有简单的原码 主  题:高薪寻找合作者:医院信息管理系统 上海机械电脑有限公司??? 小弟刚刚开始自学pb有好多问题想请教各位老大 HW待遇到底咋样??? 谁在CB里面用过游标? 关于网络协议软件的开发问题,编译成什么形式? 我是个新手,请教Linux下面C编程,该怎么入手,该看些什么样的书?来则有分!!!! 高分求源代码!又谁做过票据打印的软件!帮忙给点源代码! 如何执行insert 语句效率最高 数据窗口相同记录的判断??? 关于网络协议问题 求救,怎么判断试用版的试用天数? 关于IE的问题,help~~~ 请各位老大帮忙啊 请问如何串行化一个COLORREF变量,急---谢谢! 急,急,急,数据库更新的问题 win98下的DrawText api函数与Win200Server下的有什么不用呢? 评选水园“十大杰出青年”,请大家踊跃推荐(自荐)参评! 这个(Oracle)存储过程错在那?很简单,各位大虾看一下,一定给分!!谢谢啦!!!!! 好久不来了,有个问题请高手指点! 怎样设置SQL2000的某一字段为自动类型 熟悉GDI函数的朋友请进 如何屏蔽源代码 哪位大侠行行好,把我的密码屏蔽掉,只要不需输密码,分数一定不会少。 如何用PB制作DLL,请各位大师请教! 如何得到地址薄群組的具体用戶列表? 这里有谁用过mame编译器mingw,能否说说它的用法。先谢~~,up有分 有关win2000 server下病毒的问题 有點困惑,...... 哪里能找到最全的delphi自带的函数? 谁有CuteFtp Pro的注册码? 机器进不去系统,打开电源就听到一声响,就死在那里了,再开电源还是一样,怎么回事? 请问DELPHI里有没有对datetime变量操作的函数?? 请问BCB5生成的exe,dll怎么转成16bit的。 生活离不开阳光? 人类在开发各种能源的同时,引发了哪些环境问题?你认为该如何解决? 磨砂手机套怎么清洗可以用清水清洗么.或者可以用眼镜布弄湿来清洗么 如何加快环氧树脂AB胶的固化时间?固化时间如何控制? 人类开发能源引发了哪些环境问题,如何解决 橡胶是否透明\是否有弹性\是否容易导电 环氧树脂胶为何出现假固化现象? 什么胶水能粘得住泡沫啊?玻璃胶会腐蚀泡沫么?现在做航模呢 可是大大小小的装饰城都问了 都没有泡沫胶 一问就说 是发泡胶不啊?玻璃胶是硅酸的不知道会不会腐蚀泡沫.想一下什么胶水在 塑料是否透明?是否有弹性?是否容易导电?是否容易导热?是否有光泽? 使用杠杆千分表测量轴与圆柱同轴度时出现大的误差,先将测杆中心轴装在工件轴上,再将杠杆千分表(使用长测针)夹在测杆上进行测量.杠杆千分表夹在测杆上不同位置进行测量,测量误差很 如何去除玻璃上透明胶撕掉的痕迹? 木材是否透明?是否有弹性?是否容易导电?是否容易导热?是否有光泽? 千分尺能测量什么?卡尺与千分尺的功能有何区别? 请问我厨房水池的管和水池中间的缝隙要用什么,原来的损坏了一半了,是用玻璃胶还是泡沫胶?如果使用是不是要等到水池干了以后再封上? 与环保节约社会责任有关的手抄报如题我是学校的手抄报比赛,是要字多的 用千分尺怎样刚好就量到的就是外圆直径 有什么方法 请问厨房水池和下水管之间缝隙用什么胶?玻璃胶还是泡沫胶?(如图)用的时候是不是要等水池干了再用上 橡胶、木材、胶木、玻璃、塑料容易导电吗? 怎么举例说明人离不开地球再说说如果没有这一切,我们会怎么样?我上课要用! 怎样把5mmPVC板(1.22*2.44m)固定在玻璃上?用玻璃胶加泡沫胶能行吗 50分 橡胶、木材、胶木、玻璃、塑料哪写是非金属材料的性质 什么情况下会影响千分尺测量? 有什么不导电的金属?如题求教 如果没有的话一些较稳定的固体物质也可以的 怎么清洗洗衣机橡胶套 量铜丝的千分尺怎么使用,怎么使用千分尺测量出铜丝的粗细? 什么金属不导电 橡胶怎么清理 人类的生存和发展离不开( )和( ) 不导电的金属? 玻璃胶融化后会导电吗为什么?靠什么导电? 为什么木头不导电? 如何清除玻璃上的胶痕好用有实用, 而且不留檫痕,,表面 光泽 酸性玻璃胶是否会导电 为什么木头桌子导电桌子上是电脑 桌子是干的 木头的 用手腕轻轻的放在桌子上会有电 干木头为什么会导电 企业文化建设为什么要注重环境保护和可持续发展 关于节约资源保护环境的建议书 机械设计中同时标注平行度和平面度时,平行度应该大于平面度吗 湿木头是如何导电的单独用水是不能导电的,为什么湿了水后,就可以导电了 金属为什么导电他与塑料有何不同.有不导电的吗 平面度标注的意思 地球是我们唯一的家园摊位人类生存与发展提供了什么什么和什么,我们的生活离不开地球 手机上的触摸屏玻璃是导电玻璃吗是什么型号的导电玻璃呢,知道的请帮忙回答, 做磁路用的AB胶用哪种化学药水能够清洗 玻璃胶、泡沫胶弄到衣服上了,怎样才能弄掉呀 玻璃导电吗? 手上的环氧树脂AB胶水用什么洗最好?除了酒精和丙酮,还有没有可以用来清洗的?最好方便点的 且不伤手的.【弟弟每天都要接触环氧胶水 每天都要清洗 有没有什么护手霜好一点】 碳为什么能导电?在电解铝的阳极炭块, 碳是非金属材料,非金属的结构,我想知道碳导电的机理是什么?除了碳还有什么非金属能导电? 什么是导电玻璃,起什么作用?导电玻璃和一般的玻璃有什么区别? 螺旋测微器如何测量?如题:如何用螺旋测微器测量?如何读数? 干木头为什麽不会导电? 酷派5910橡胶手机套怎么洗才洗的干净? 千分尺测量问题请问我如果要测试的是大约一张纸那么薄的金属片..24张金属片..最最薄的可能只有复写纸那么薄,厚的也不过一毫米..千分尺能搞定吗?金属片厚度都不同.不是叠放.是单独测量. 西安哪里有卖海绵橡胶或者泡沫橡胶的? 导电玻璃是怎样导电的?哪能买得到? 举例说明我们的生活离不开光? 在手不碰到水的情况下带水的木头筷子导电吗? 如何清洗手机套 有没有什么植物或生物生存不需要阳光?如果有,请把那种生物介绍尽量详细一点,感激不尽! 人类的能源主要有哪些.这些能源的开发利用前景如何.对环境影响如何 玻璃可以导电吗?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn