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

Android JNI开发高级篇

HTML文档下载 WORD文档下载 PDF文档下载
Android JNI开发高级篇

作者:Android开发网


   有关Android JNI开发中比较强大和有用的功能就是从JNI层创建、构造Java的类或执行Java层的方法获取属性等操作。

    一、类的相关操作

    1. jclass FindClass(JNIEnv *env, const char *name);  查找类

    该函数可能做过Java开发的不会陌生,这个是JNI层的实现,需要注意的是第二个参数为const char*类型的,我们如果从Java从层传入unicode编码的jstring类型需要使用GetStringUTFChars函数转换成utf8的const char*,如果成功返回这个Java类的对象jclass,相关的异常可能有

     (1. ClassFormatError 类的数据格式无效
     (2. ClassCircularityError 该类或接口是自身的超类或超接口
     (3. NoClassDefFoundError 没有找到指定名称的类或接口 
     (4. OOM内存不足错误,即OutOfMemoryError  

     2. jclass GetSuperclass(JNIEnv *env, jclass clazz);  获取父类或者说超类   

     该函数的第二个参数为jclass类,我们调用时传入的是子类,否则返回将是NULL

     3. jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1,jclass clazz2);  判断class1对象能否安全的强制转换为class2对象  

     如果可以将返回 JNI_TRUE,JNI_TRUE的定义值为1,否则返回JNI_FALSE即0 ,这里Android123详细说明下哪些情况可能返回真:

     (1  这两个类参数引用同一个 Java 类
     (2  第一个类是第二个类的子类
     (3  第二个类是第一个类的某个接口

     4.  jclass GetObjectClass(JNIEnv *env, jobject obj); 通过对象获取这个类

     该函数比较简单,唯一注意的是对象不能为NULL,否则获取的class肯定返回也为NULL。

    5.  jboolean IsInstanceOf(JNIEnv *env, jobject obj,jclass clazz); 判断对象是否为某个类的实例

   这个函数是JNI层的实现,相信大家都不陌生,Android开发网提醒大家需要注意的是返回值可能产生异议,就是如果传入的第二个参数为NULL对象,NULL对象可以强制转换为各种类,所以这种情况也将会返回JNI_TRUE,所以一定判断传入的对象是否为空。

   6. jboolean IsSameObject(JNIEnv *env, jobject ref1,jobject ref2);  判断两个对象是否引用同一个类

   需要注意的是如果两个对象均为空,返回的值也会是JNI_TRUE所以使用时判断对象为空。

   二、调用Java方法

   首先说下有关签名sig相关的比如 "Ljava/lang/String;"

   1. jmethodID GetMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);  获取一个Java方法的ID

     这个函数将返回非静态类或接口实例方法的方法 ID。这个方法可以是某个clazz 的超类中定义,也可从clazz 继承,最后一个参数为签名,最后两个参数是const char*类型,是utf8类型。需要注意的是Android123提醒大家执行GetMethodID()函数将导致未初始化的类初始化,如果要获得构造函数的方法ID,使用 <init> 作为方法名,同时将 void (V) 作为返回类型,如果找不到指定的ID将返回NULL,同时异常可能有:

    (1  NoSuchMethodError 找不到指定的Java方法。
    (2  ExceptionInInitializerError 如果由于异常而导致类初始化程序失败
    (3  OutOfMemoryError 内存不足

  2 . NativeType CallXXXMethod (JNIEnv *env, jobject obj,jmethodID methodID, va_list args); 调用XXX类型的Java方法

     执行Java类中某个方法,需要注意的是这个里的java类是非静态的,由于Java的方法的类型比较多,所以该函数可能有以下几种形式,如CallObjectMethod,CallBooleanMethod,CallByteMethod,CallCharMethod,CallShortMethod,CallIntMethod,CallLongMethod,CallFloatMethod,CallDoubleMethod和CallVoidMethod,需要注意的是,该函数的第三个参数为通过GetMethodID函数获取的方法ID,最后一个参数为这个方法的参数表,最后的va_list宏可以通过搜索获取具体的使用方法,这里Android开发网不再赘述。

  3.NativeType CallNonvirtualXXXMethod (JNIEnv *env, jobject obj,jclass clazz, jmethodID methodID, jvalue *args);

    CallNonvirtualXXXMethod函数和上面的CallXXXMethod 不同之处是多了一个jclass参数,CallXXXMethod是根据对象来调用方法,而CallNonvirtualXXXMethod是根据类的实例调用,区别在这点。

   上面的三个均为非静态类的获取,执行调用,需要实例化这个类才可以执行,下面的为静态调用。

   4.  jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);

   5.  NativeType CallStaticXXXMethod(JNIEnv *env, jclass clazz,jmethodID methodID, ...);    

   三、访问Java对象的域

    Java对象的域或者说字段、属性(Field) 类似方法的执行

    1. jfieldID GetFieldID(JNIEnv *env, jclass clazz,const char *name, const char *sig);  获取实例对象的域ID

    需要注意的是,非静态的实例化后的对象,可能产生的异常有

   (1 NoSuchFieldError  找不到指定的域
   (2 ExceptionInInitializerError 因为异常而导致类初始化失败
   (3 OutOfMemoryError内存不足。

    2. NativeType GetXXXField(JNIEnv *env, jobject obj,jfieldID fieldID);

    类似GetXXXMethod函数,可能有的类型有 GetObjectField,GetBooleanField,GetByteField,GetCharField,GetShortField,GetIntField,GetLongField,GetFloatField,GetDoubleField。

   3. void SetXXXField(JNIEnv *env, jobject obj, jfieldID fieldID,NativeType value);

    Java的域可以赋值的,可能有的类型有 SetObjectField,SetBooleanField,SetByteField,SetCharField,SetShortField,SetIntField,SetLongField,SetFloatField,SetDoubleField。

    上面3种情况均为非静态对象的域,对于不需要实例化对象的域,可以直接使用下面的。

   4. jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz,const char *name, const char *sig);

   5. NativeType GetStaticXXXField(JNIEnv *env, jclass clazz,jfieldID fieldID);

   6. void SetStaticXXXField(JNIEnv *env, jclass clazz,jfieldID fieldID, NativeType value);

  四、实例代码,Android123给网友准备了一个例子,帮助大家实战Android JNI开发,大家可以移植到Android NDK环境中执行,网友可以访问 Android JNI开发代码 (Android JNI实例代码(一))

  最后有关Android JNI最后的终极内容,Android开发网主要说明下JVM和JNI的全局引用相关内容,比如本地全局引用LocalGlobalRef,弱全局引用WeakGlobalRef,JNI中线程处理的高级方法比如AttachCurrentThread,以及JNI中的NIO的相关特性将在明天继续讲解,更多的有关Android平台NDK开发内容可以查看我们 Android NDK开发技巧系列文章。

Google等互联网公司将成为创新中心? 在Hadoop的战争中 MapR获新一轮3000万美元融资 初创公司DNNresearch:谷歌科技帝国的新“基石” 创业了,我们该如何起名? 乐视网联手富士康推新盒子C1S “0+290元”新浪微博发售 吸引开发者:只要开发新应用 微软便奖100美元 PaintCode - 将矢量图转化为Objective-C代码的开发神器 苹果发布iOS 6.1.3 封杀evasi0n越狱所用漏洞 [API快讯] Google开放实时协作API 58同城开源轻量级Java Web框架 Argo 初创公司AppNeta:4轮融资,4780万美元 MongoDB释放2.4版本:692更新及8大得意之作 十年6亿美元!Amazon云计算喜获CIA大单! 国人当自强:HTML5+联盟首次筹备会成功举行 开源框架TAAE发布 快速打造iOS音频应用 如何学会600多种编程语言 “第五届中国云计算大会”将于2013年6月5-7日在京召开 Ridiculous Fishing:游戏遭遇山寨如何一雪前耻 老游戏的今天:Doodle Jump每周进账2万美元 剑指Evernote 谷歌正式推出Google Keep 开源的JS MVC框架 Backbone.js 1.0发布 前Facebook资深员工王淮给技术创业团队的十点建议 微软发布Windows Embedded 8系列操作系统 Google Play 4.0抢先体验 中国 vs. 非洲:移动医疗的前世今生 Java大数据框架初创企业Concurrent获400万美元融资 基于Edge Animate开发CSS3 Animations 后端服务商Firebase发布全新iOS SDK [爆料]百度云或在秘密打造实时移动Web App开发框架 打造最佳开发团队的几点建议 Facebook与开发者交恶 扼杀第三方应用 世界著名病毒编写组织和成员介绍,包括大名鼎鼎的29A(希望反病毒厂商能给他们发感谢信!) 各位,请问哪里有在winxp下查看拨号上网密码的软件? 请问到底是xp好还是2000好?或者xp有什么缺点(硬件要求高不算)谢谢! 求VSS6.0C下载 大家觉得:女孩子身高多高最合适? 我想写:select * from talbe where name like '杨%',写到adoquery1.SQL.Text后面怎么写阿?那些''''搞得我昏了,哪个好人来讲讲? 微软出版的《SQL Server2000技术内幕》这套书怎么样,看过的来讲一下啊 c#好还是bcb好?会不会淘汰bcb呀? 讨论!!!大家帮我想想!这样会不会是访问该站点的所有人只用一个SQL线程呢??? 如何在PB下实现Windows风格的标准按钮栏?请高手帮忙,十分感谢! 读DBF中被删除的记录 在div里如何加水平线 Web Service是这样慢吗? FreeBSD下C++语言工程文件的编译问题 此贴开给“zzheaptech(风的往事)”接分,感谢热心的朋友们,向你们致敬! 大家进来给个建义 谁能告诉我资源文件的语法,或者有好的关于C和C++的好网站!谢谢!!! 如何计算当天的时间差值? 这个SQL语句错在哪了? 小弟有四个三角了,放分 都说php用word很简单!!我怎么从来没成功过!!!!?? 不能反问表是什么原因 请问在局域网内的电脑怎么样象电信拨号服务器那样,使之设置成为可以提供拨号服务的主机? 高分求答 文字型简易电子计算器设计 又一个delphi处女作!下载照样送分!提了改进方法的送高分! 菜鸟问题!谁能详细叙述一下,如何将编译过后的exe文件中的数据库正常的链接使用! 大家帮我看看我打印机的问题。 请问怎么设置使局域网内的电脑能象电信那样成为可以提供拨号上局域网服务的主机? 简单的问题.关于MFC命名规则: 老实说,是不是mysql驱动有bug,或者是java.sql.ResultSet类有bug?? 关于QQ的问题,请各位帮帮忙。谢谢! 很简单的问题,JB中用JDBC连接SQL2000怎么不行? sql总是不正解,请看看! 请教各位大侠两个困扰很久的两个问题!!! 高分求救疑难,200分相赠,急!!! 在XP中,无法从右击我的电脑>>管理,进行共享文件或文件夹的设置,急!!! 如何对同时对两个表(一对多关系)进行保存操作? 请问vc能否导入vb作得一些东西,如界面之类得。 在线求解! 如何在客户端用Java检测Radio组的那一个值被选中,在线等待, asp.net高级编程打印中 有没有人能提供点主页空间? 請問Driver跟Firmware有怎樣的分別呢? 通过高级程序员的考试,散分。 简单问题! 在V B中怎样得到当前活动窗口的句柄 寻求超星阅览器注册码 100分 怎样在ADO中执行长sql命令 请问学习JSP周期短还是ASP.NET周期短快??????????? writeXMLFile(String outFile) C++ Builder 加 MO2 的可行性?是不是比VC++ 加 MO2 好? 埃及反对军事打击叙利亚法国慎言军事干预叙利亚美军轰炸传闻在即 以色列群众争抢防毒美发射一颗“间谍卫星”专家认为:美对叙动武为进军伊朗前奏法国调查美“棱镜”计划中新关系开新局英国国会投票反对政府向叙利亚动武西方暂缓对叙开战步伐 联合国化武调查科学家培养出“迷你人脑” 可用于疾病英国防长:英国不会参加对叙军事行动洛杉矶打击酒驾与超速 逾千人被拘捕美国称将按照符合美国利益原则对叙采取美国称将按照符合美国利益原则对叙采取英国防长:英国不会参加对叙军事行动洛杉矶打击酒驾与超速 逾千人被拘捕日本增兵那霸 意在经略西南俄称联合国专家工作中断后不应结束叙化国际新闻早报:美国向叙利亚附近海域增[组图]中国女星闪耀威尼斯 盘点出席邓小平与撒切尔夫人交锋记【助力中考】做好这些小细节能起大作用揭秘:宋代五大名窑之官窑!日媒:中国现役战机多达3000架 构千万别下手 火影手游佐井值不值得购买这个可以有! 专为女孩设计200元就eSmart展会前瞻:VR时代来临世厦门路虎猛撞捷豹,竟因为投资招宝网被内退后还有哪些权利?这些创业公司年融资超过1亿却失败了!体验镭拓 MXX 机械键盘---美的新我智能握力器,释放肌肉的魅力早泄怎么治教你4招穿好凉鞋,好看又不伤脚!夏季养肝的食疗方法人流手术后应该吃什么酒钢集团年年举债600多亿元 去年利三哥享福了!小米5黑色款将加大印度市资本追逐成都网游业 升华拜克16亿收股利支付率达9589% 新三板公司高FixedGear 固齿新手教程——这首百度广告歌好魔性:贴吧女团葫芦姐
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘