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

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开发技巧系列文章。

为什么开发者倾向于使用杂乱无章的免费工具 EMC合作伙伴销售经理杜术清:实现云的三种途径 开发者想走向海外:你融入老外的圈子了吗? 前微软工程师:美国监控和直接访问服务器?这不太可能 代码、TDD速查表 如何选择前端架构:服务器端HTML vs. JS部件 vs.单页Web应用 世界上最高深的Android特洛伊病毒 招聘iOS开发,老板必问的5个问题 护航科技吴伟湘:IT离线安全体检服务将带来颠覆 百度王继平:移动互联网时代云平台思路 “第八届开源中国开源世界高峰论坛”火热开启 微软发布SQL Server 2014预览版,展示内存数据库技术 帮助软件开发者提高效率的10个小窍门 我想做个程序员:Technovation Challenge圆女孩编程梦想 未来我们开发的Google Glass应用将会是什么样? 独家:前RIM大中华区总经理刘征宇,加入Appconomy 用一个API搞定一切 Segment.io为移动开发者提供便利的分析数据分发服务 TIOBE 6月编程语言排行榜:JavaScript回归前十 《Kingdom Rush Frontiers》上线后 迅速抢占27个国家游戏榜首 移动周报:85后程序员,iOS开源项目,细数7天大事件! Instagram:从Redis到Cassandra 成本节省1/4 乐元素CTO凌聪访谈:游戏引擎技术选型之王道 iOS 7的新设计并非止于外表 WWDC 2013大会10大启示:正向开发者支付大量现金 云计算大会微软专场成功举办 Windows Azure公众预览版上线 IBM全球大裁员 在美国裁员已经开始 动动鼠标,决定“中国十大优秀开源项目”的归属 为改善Flickr 雅虎收购拍照应用开发商GhostBird 让你轻松学习新代码库的六个步骤 RESTful API 设计最佳实践 谷歌11亿美元豪购Waze原因:获取数据 争本地广告市场 高分赠送:求solaris下的整个目录情况. Linux下进程或者线程间使用什么方法通信效率比较高?谢谢! 关于select语句问题 请高手帮忙,给出一个关于modem编成的源码 三层开发后的程序分发问题,请进! 請各位幫忙~~~~~~~~! NT4上的500错误怎么解决呀? 哪位认识它:readme.eml(图表是一个打开的信封,白色) 急!!UserControl_Resize()什么时候触发? 如何取得当前的数据集??急急! 如何从网页上下载图片到本机? 哪位认识它:readme.eml(图表是一个打开的信封,白色) 编译提示打不开rc文件.怎么办啊? bitmap和icon什么的还可以在Resoure里编辑. 有无可能向用户隐藏下载文件的地址? DataRowView的问题 我用delphi一年多了,下面是我做的一个小东东,欢迎大家提意见。 硬盘被关闭的问题 请问,做一个dcom程序,怎样注册server端client端, 丢附件的问题 一个加急问题!!!怎样取得这个数组的值??? 如何在TreeView的NodeClick事件里得知当前node的上一级node的text? 我用MFC做了一个报表程序,开始时吧菜单中的“打印预览”删除了,请问我怎样再加入打印预览菜单项而且可以实现原来的功能? 让我们做一对幸福的老鼠[zz] ******请问sybase sql anywhere 7是否就是adaptive server anywhere 7(asa) linux能使用ADSL吗??? 大家来讨论一下多播和组播吧! 请问在深圳要到哪里什么时候报考高级程序员啊? 一个加急问题!!!怎样取得这个数组的值???? 時間問題比較 怎么给wstring赋值? PB与sql server 连接的问题 大虾们,我的这个程序错在哪?就是不出现像要的结果bezier曲线??在线等候!!!! 请教各位大侠,关于SQL与应用程序进行封装的问题 二个简单Access问题 关于更新表中的记录用sql.add该怎末写? 如何修复已经损坏的excel文件?急 请问谁有操作WAB文件的资料,可以给我一份吗? pb 6.5 分布式问题 拉有免费软件的上传空间?????? 使用JBuilder6出现的“找不到数据库驱动”的问题 哪里有中英文的VC书下载? 请帮忙:能传给我C++ primer 电子文档. 急!!UserControl_Resize()什么时候触发? 二个简单Access问题 北京项目管理,系统设计同行 关于ActiveX控件(OCX)的两个问题 ****急*****请教注册码的检验原理 怎样得到98/me/2k/xp下的桌面壁纸? 大家好,我想取消TStringGrid上,点右键出现的popup菜单,请指教 二个简单Access问题 请各位高手指教:怎样用VB读出WORD中指定区域的内容。 今年冬天海水会结冰吗 1,磷酸高温(800-900)分解后除了偏磷酸和焦磷酸还有其他物质吗?一,磷酸高温(800-900)分解后除了偏磷酸和焦磷酸还有其他物质吗?二,85%的超纯磷酸里含有P2O5吗?如果有含量多少? 屈服于命运的例子最好是那动物做的例子 比如燕雀安知鸿鹄之志 燕雀屈服于命运 安守乐窝 没有反抗精神 思绪万千,青翠欲滴造句 一杯水的电阻有多大 河水是怎样结冰的? 祖国的伟大成就15年以内的不要太啰嗦不要作文 水的电阻值一般有多大 元素符号的谜语是,有哪些? 祖国取得的巨大成就说事件多一点的.. 怎样计算斜齿轮的螺旋角 哪位高人可以提供给我谜底是标点符号的谜语啊? 什么叫科学小品或科学童话 某绿色植物细胞是植物吸收水分的主要部位的细胞,对其中某细胞器的组成成分进行分析,发现A、T、C、G、U五种碱基组成如下表.由该细胞器参与完成的生理活动是(具体见图) 飞机飞行200米大约需1什么 有关写马的诗 水电阻如何制作 飞机飞行高度是2500米,上升200米又下降358m,这时飞机的高度是_______. 有关马的诗有哪些?“葡萄美酒夜光杯,欲饮琵琶马上催.” “开张天岸马,奇逸人中龙.” “春风得意马蹄疾,一夜看尽长安花.” “香车宝马照九陌,家家花下扶醉人.” “好山好水看不够,马蹄 生物的遗传和变异是以细胞内基因的什么为基础的? 一架飞机在海拔8000米高度飞行,在空中测出前下方海岛两侧海岸俯角分别是27°和39计算这个海岛的宽度, 水的电阻值是多少,3QM 关于生物的遗传和变异1.下列有关遗传的各项叙述中,正确的是( )A.1个染色体上只有1个基因B.1对相对性状有一对基因控制C.生男生女有女方决定的D.不同的生物细胞含有相同数目的染色体2.下 名人成功之前所受的挫折,改变自己的道路,最后取得成功的实例 什么电阻可以降低水的电阻值像钓鱼用的夜光漂浮那样的电阻叫什么电阻 生物遗传和变异http://wenku.baidu.com/link?url=EwIDAiMN9nLeNdLnPPtynjX6c8xw61yF0-4o-FSJRl4AqN3yM0gLo_FdBXpTKSWstpv4vio79dYmzKpFNKJCb-z2bZoR4jKJHcrNs6fSRbm求此套题答案,选择不要了 伽利略斜面实验是理想实验吗 遗传和变异的秘密 古今中外有关“做生活的强者”、“不向命运低头”的事例 有朋自远方来(猜一化学名词) 祖国伟大的成就有什么?62年以来的 在困难面前不低头的事例不要特别有名的一两个即可 猜有关化学的谜语一)以下各打一种化学有机物1.一对亲兄弟,外貌无差异,一个浑淘淘,一个醉醺醺(打两个有机物)2.相加是十八,害虫见了怕3.尝尝甜,不是糖,瓶口敞,难用光,与肥皂,是同胞,寒 祖国有哪些伟大成就 磷酸根和氢离子的反应生成什么呢 1:品德高尚(打三种化学元素)2:五彩缤纷(打五种化学元素)3:金属之冠(打一化学元素)4:下毕围棋(打一化学名词)5:父母出门(打一化学名词)6:屡战屡败(打一化学名词)7: 磷酸根离子的检验方法有哪些 海水为什么不易冻结 一道化学谜语各打一个化学元素:黄金被盗.值不值钱全在加两点 关于磷酸根离子的检验在含有NaI Na2PO4 Na2CO3 的混合溶液中怎样检验磷酸根离子啊(不用通常的先加硝酸银 在加稀硝酸 看沉淀溶解状况 有碘离子现象可能不明显) 有其他办法吗? 磷酸中氢离子比上磷酸根离子之比大于3 如图所示为斜齿圆柱齿轮—蜗杆传动,小齿轮1由电机驱动.已知蜗轮4为右旋,其转向如图所示.为使中间轴轴向力互相抵消一部分,试在图上标出 (1) 蜗杆的旋向 (2) 齿轮1、2的旋向及转向 ( 生物的遗传和变异是通过什么实现的生物的遗传和变异是通过( )而实现的 海水为什么不容易结冰? 为什么渐开线斜齿圆柱齿轮很少采用变位传动,而蜗杆传动则常采用变位传动. 足够大的电压通过水体~水会沸腾吗? 生物的遗传和变异是通过什么来实现的? 水是导体,那水有没有电阻,它的电阻由什么决定 怎么样降低水的电阻值 为什么焦磷酸和偏磷酸的酸性比正磷酸强 水电阻的原理 水电阻 急用!我知道水电阻的作用 请问它是如何实现降压作用的 其内部原理是什么? 生物关于生物的遗传和变异的几道题1 下列哪种细胞内没有成对的基因?A.受精卵 B.卵细胞 C.白细胞 D.神经细胞2 下列哪一种变异不能遗传给后代?A.一队正常的夫妇生了一个一只手有六个手指头 生物的遗传和变异指亲代和子代及____各个体之间举例如:种瓜得瓜,种豆得豆__________;一猪生九仔,连母十个样_________. 我国冬季肯定结冰的河是哪条河? 如何用钼磷酸铵如何区分磷酸根 偏磷酸根 焦磷酸根 生物的遗传和变异由什么控制 冬天的大海会结冰么?如题 普通PCR过程中会产生焦磷酸根离子吗?在LAMP过程中,由于核酸大量合成时,从dNTP析出的焦磷酸根离子与反应溶液中的Mg 结合,产生副产物一焦磷酸镁沉淀,从而使得LAMP不用电泳就能检测.那么在普 你还知道哪些名人战胜命运取得成功的事例:
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘