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

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

Visual Basic 中制作流水灯 Visual Basic动画编程技术 Visual Basic环境下Video/ Audio压缩数据流播放技术 Visual Basic设计多媒体应用程序 Visual Basic影音控制 Web动画图像分解在VB动画设计中的应用 播放 .flc 动画 -VB资料 播放 AVI -VB资料 播放MP3文件 -VB资料 播放背景音乐 -VB资料 播放声音文件 -VB资料 播放资源文件文件中的声音-VB资料 不用ActiveX控件也能播放声音文件-VB资料 VB创建动态图标 电影结束画面的卷动效果-VB资料 二进制操作截取VCD片断 -VB资料 非常VB测声卡 关闭屏幕保护功能,改变屏保等待时间 -VB资料 VB获取桌面窗口图象 红色警戒&amp;终级动员令-VB资料 检查是否安装声卡 -VB资料 将 .flc 动画档放在某一个 hWnd 之中播放 -VB资料 截取屏幕图像-VB资料 开机,自动更换墙纸 -VB资料 控制PC喇叭 -VB资料 利用VB测声卡 利用VB进行多媒体程序设计初步 利用Visual Basic设计多媒体应用程序 满屏播放AVI文件-VB资料 平铺贴图背景 -VB资料 破解WINDOWS屏幕保护密码 -VB资料 高手关注:为什么收不到 WM_NCLBUTTONUP 消息? 毕业设计的问题(急) 关于SQLSERVER的BACKUPLOG 关于qq菜单的问题 GD绘图输出问题? 怎样在数据窗口中设置打印,要求实现自定义纸张??? 关于初学做练习的问题请教! 实现界面重定义的问题 有关对话框显示前的... 关于photoshop中的问题! 在CXXXApp里如何调用CXXXDoc里的变量? 关于ADO对象的用法? .x文件中animation set中的rotation是弧度,还是? [php版]公告:关于删除 IShellFolder 发贴的通知! 有了seq server基础,想深入学习一下,改怎么做? 请问高手,有关数据导入导出的问题! 高分求《VC技术内幕》第5版 求源码!!!!!! 出大问题了 notes designer的问题(在线等候.....)急!! 关于csdn上的网络道德问题!大家的网络需要大家共同来支持!(每一个真正的程序员都应来声援!) 高分回报:一条简单的SQL语句写法,谢谢各位大侠, asp中寫Response.cookies ("ITEM1")("SUBA")="Standy"在dotnet(C#)中如何讀出 在局域网内。知道一个机器的IP地址。如果获取这台机器的名字 带外数据具体有何用途?(在线等) 加了一个三角,高兴,散分! 请问一个三位重构的问题,哪里有这羊的的示例程序? 显卡显示有阴影??? 有挑战性的翻译,请翻译下列C++名词,并请举例说明 麻烦大哥们看看!关于wab应用中在datagrid中取值的问题 如何实现CSDN这样回答问题的效果? 初级问题,请各位大侠帮忙! 数据结构中关于二叉排序树的生成问题 请教高手:如何在一区域找到找到指定颜色的点?? 一个关于窗口的问题 如何在数据窗口实现编辑、修改等后的撤消、复制、粘贴、剪切功能! exec,sp_executesql语句,中字符串变量的问题 急~~~~(请赐教)! window.showModaldialog()问题 关于Internet Explorer不能打开链接的问题 求助 求购:中国地质大学(京)网络历年考研题复习资料 Longhorn与WINDOWS2003是何关系? applet的执行顺序问题?? 在数组里找到最大值的函数是什么? 没有监听器? VB .NET能用于AutoCAD开发吗? 如何用OnMouseWheel实现Image的放大缩小? 装了Media Player 9.0,怎么没声音? 如何将DataSet中的数据全部写入数据库? 简单问题(关于光标移动) 一个关于java的小问题要请教? 请问delphi中有二~十进制的转换函数吗..... 关于不同页面调用的问题,谢谢 关于函数表达方法的一道难题已知函数y=f(x)满足f(x)=2f(1/x)+x,求f(x)的解析式 这个问题?化学的为什么选C呀?可我觉得都不对呀! 补充句子:凡是见过圆明园遗址的人,都 天空是什么颜色的天空也是蓝色的因为它们曾经相爱过 谁知道具有吸附性的物质除了用PH 纸,还能用什么试剂鉴定?能具体列出来吗?sorry .没有完整,就是有吸附性的物质除了用PH试纸之外,还能用什么试剂来鉴别他的酸碱性? 初一老师不检查作业?这 这可能吗?! 三年级的英语作文【题目:Me】50字以上可不可以唔后这么长,最好有翻译~~~~简单介绍,快滴丫 如图,下图 古希腊悲剧对西方文学的影响如题 天空是蓝色的海也是蓝色的心是什么颜色的? 谁有7年级下册 同步练习1+1 (华东师大版)练习册的参考答案?帮帮忙啊``!及需啊 .. 救命啊 .. 快啊.我 急要. 求求大家帮帮忙.~! 詹天佑是那里人 18函数高中 所有练习题答案(同步训练和配套练习册),有一门发一门,从后往前发,前边的都写完了,最后2~3单元就行,但语文配套练习册全要! 北京曾是那几个民族,哪几个政权的都城如题 第二个式子中为何-1, 延边人民出版社的,要是方便给下册也给我也行啊!..1.许多人类学家认为i,人的始祖是( ) A.两河流域的苏美尔人 B.中国南方古猿 C.非洲南方古猿 D.腊玛古猿 这是第1课 人类的形成的第一题 北京地区曾是哪几个民族、哪几个政权的都城,有何别称? 怎么用函数表示这几个式子xy=10根号下x²+y²=dl=2X+2y 一个操场如下图,沿着操场跑道跑一圈是多少米? 3包科技书和5包故事书共430本,同样的5包科技书和3包故事书共450本,每包科技书和每包故事书各多少本? 急需5篇初中水平英语作文!50字即可.有关旅游·初中生活·购物·新年==都可以.在此说明〔支持原创!打击盗版! 体育场跑道如下,运动员跑了5圈,他跑了多少米?中间是一个长方形长为100米,一边一个半圆圆的半径为25米 写出北京从古至今曾是哪些政权的都城 我的正常的一天 早上 6:20 起床 6:40 坐车 7:15到校(20分以前就要到校 迟到的还要写检讨?游街示众?)7:20准时上第一节课(班里的平均分没上90要写检讨?)4;30 自习(说白了就是下午第四节课)5:5:10-6:30 中国近代史第一次巨变 4包科技书和5包故事书共430本,6包科技书和6包故事书共570本,每包科技书和每包故事书各多少本?一定要是方程.可用消去法. 立志做个美德少年 1、中国近代史上首次打破列强垄断局面的交通行业是? 谢谢~无.急。。 关于寒假、春节的作文集取一个题目 电工换算功率大全 曹刿论战的中心句和主旨句 智子疑邻从积极方面说,主旨是什么? 电工的换算公式1安等于多少瓦 有人会做吗?,谢谢你的回答,化学, 作文集的题目取什么好?要与这个封面的情调相符合的名字. 曹刿论战中写曹刿详查敌情的句子 十万个为什么读书笔记不是读后感.只要主要内容和感受体会,不要长篇大论的,100左右就行了. 帮忙设计一下作文集的封面,我的题目是《琉璃星空》,帮帮忙啊.希望大家帮帮忙,如果封面做不好,我会被老师批死的。封面颜色淡雅最好一点,急!!!!!...... 电工换算调压变压器上1vA是怎么计算出来的要公式.我想知道1VA有多少电流. 翻译成英语:1收到礼物2点蜡烛3吹蜡烛4许愿5打开音乐6五快巧克力7两束花8三瓶墨水9取得高分 列举历史上都城在洛阳和南京的政权分别有哪些 曹刿论战中写曹刿祥差敌情的句子是 小华调查了全班同学在母亲节送给妈妈礼物的情况,八分之三的同学送鲜花,五分之二的同学送贺卡,其余的同学是上面问题(接着):自己的一张画,送画的占全班的几分之几?若有人解答,感激 什么动物表面温顺而它很凶狠什么动物看起来很温顺,其实他很凶狠 请帮我用西班牙语翻译一下这句话:tie a mo! 小京调查全班同学在母亲节送给妈妈的礼物,1/4的同学送鲜花1/3的同学送糖果其余的同学送自己做的贺卡送贺卡的同学占全班人数的几分之几 有什么动物是平时温顺 但是一旦被激怒就会变得异常凶猛的啊··要是已知的动物 最好是现存的动物··要是帅气的动物·· 的读书笔记六年级水平的 母亲节时,五一班全体童鞋都送了礼物,其中送鲜花、贺卡、图画,送鲜花占3分之1、送贺卡占4分之1、送图画的占4分之1,第一个问题送鲜花、贺卡、图画的人数占全班人数的几分之几?第二个问 求二元一次方程2x+3y=20的非负数解 新西兰的几维鸟是曾与恐龙生活在同一时代的古老鸟类,它: 初一的作业量一般是几点可以做完或者几小时今年刚初一,作业一般从7:00写到8:30,不知正常不没糊弄~(但也不是太认真). 求二元一次方程2X+3Y=12的非负数解 若一次函数y=ax+b与y=cx+b在同一坐标系内的交点坐标是(2,-3),则方程组y=ax+b和y=cx+b的解是 新西兰几维鸟图案的奶粉是哪个啊? 中国古代朝代表及都城表要有五代十国的,还要有东晋十六国的. 若一次函数y=ax+b和y=cx+b在同一坐标系内的图像的交点在第一象限,则方程组{y=ax+b{y=cx+b的解若一次函数y=ax+b和y=cx+b在同一坐标系内的图像的交点在第一象限,则方程组{y=ax+b y=cx+b的解x=m y=n 几维鸟和鸟类公园怎么样 初一什么课程作业量最大,(人教版的)? 非法行医为何屡禁不止? 彻底根治需要湖南3公务员偷拍县委书记获刑 关键视解放军侦察船抵近夏威夷 为进入第三岛印共领导炫富被开除 印共领导指其不道苹果公司发布新一代iPad等产品英国乔治小王子受洗仪式23日举行 不浙江抽查M15甲醇汽油合格率80%中美工商领袖和前高官第五轮对话在美举日外务省网上传视频主张独岛主权 韩严日本民主党代表用“四面楚歌”形容自己美国校园枪击案枪手曾遭欺凌 开枪或为美国载175人客机因引擎故障紧急迫降沙特拒安理会席位 美国作说客寻与沙特澳报:沙特拒安理会席位系赌气?印度妇女盛装庆祝传统\"女人节\"纽约杜莎馆迎万圣节 大师雕刻南瓜版L美国企业研发氦气球游大气层 每人旅费欧盟要求乌克兰履行入盟条件 季莫申科美俄官员将会晤联合国特使 助推叙问题经合组织要求巴西实施结构改革联合国副秘书长:巴以实地局势动态令人成都双流国美电器库房起火 火势还未得破天荒!女裁判执法韩国K联赛 水平获林丹2:0击败杜鹏宇 实现全运会男单中方:希望各方抓住契机,推动妥善处理“大美西双版纳·全国工笔画学术展”在李克强:区域贸易安排不应也不能替代多俄罗斯或将向伊朗提供S 300防空导成都地铁今日开展“文明乘车日”主题活全运会男子1500米自由泳 孙杨轻松江苏科普日36所高校重点实验室将对外南林新生报道“二维码”受追捧 家长可中秋节海南调整省内汽车票预售期:可提梅花奖照亮艺术路??记山西最年轻的摘今年节前月饼销售遇冷 “天价月饼”淡苏贞昌决定取消与马英九辩论两岸服务贸四川双流一仓库发生大火 过火面积约3十二家银行牵手市工商联 百余个平台服李克强谈经济合作:没有哪个国家能变成8月数据陆续出炉:中国经济企稳回升香港将举办三场大型彩灯会庆中秋中国女子新“飞鱼”陈欣怡全运50米自
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘