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

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

Twitter开源Summingbird:近原生编码下整合批处理与流处理 亚马逊推Matchbook 欲将顽固纸质书读者拉向电子书 Broadcom为可穿戴设备推新开发平台WICED 再战江湖 New Kodak还牛不牛? 郭理靖:公、私有云架构异同点与难点 美化代码的15个代码语法高亮工具 你所不知道的虚拟化和云计算 [开源推荐]Effeckt.css项目:CSS交互动画应用集锦 针对Google Glass应用的四大UX设计原则及典型应用 Google收了摩托罗拉,微软收了诺记,黑莓又将花落谁家? 十亿月PV网站秘诀:Reddit自失败中总结的25条经验 粉碎5个NoSQL流言:各司其职,NoSQL的出现比关系型更早 豌豆荚发力移动游戏平台,推出SDK 2.0 BlackBerry Jam Asia 2013即将在香港隆重召开,免费门票限量提供 小米发布会高潮迭起:米3、电视、Hugo大牛 谷歌放在Windows上的特洛伊木马:Chrome Apps应用平台 解析:Google基于数据驱动的招聘面试程序 决战“缓存”之巅:微软 vs. 亚马逊 雪中送炭:十大前沿移动应用开发工具 高通智能手表Toq都用到了哪些技术? 研发周报:修改一行SQL代码 性能提升了100倍 2013年NoSQL就业趋势分析 鲜为人知的静态、命令式编程语言——Nimrod 高性能Web应用打造攻略:扩展过程中20个最大的绊脚石 开源项目Marathon:让你的数据中心像谷歌一样运行 精益化运营:10款移动统计分析工具推荐 移动建站工具(一):分秒钟将Web网站移动化 移动周报:小米的“倚天屠龙记” 智能手表是个尴尬的产品 屏幕缺陷一枪毙命 看15岁的谷歌的前21位员工现在都在做什么 分析师:三星将失去中国市场份额的头把交椅 ★★★简单问题送100分★★★:如何打印框架容器里的的全部内容,包括mschart图表,label,combox等? 我的DW里加入FLASH特效时为什么中文会变成乱码?我给分的............ 我感到天昏地暗、日月无光、前途渺茫、无心睡眠、精神恍惚、双目痴呆相恋8年准备结婚的女友突然和别人结婚了!我受不了了!我快疯了! 请教有关IE5带的ActiveX控件Dhtmled.ocx的98下安装问题 程序员与高级程序员到底那个好过 关于 delphi的一点东东 access一个日期时间字段是短格式的,用什么SQL语句改成长格式的? 怎样才能在主页中显示自己的qq是否在线?????? 有没有平面按钮控件 Interdev6.0 IDE 环境下无法使用MSDN access一个日期时间字段是短格式的,用什么SQL语句改成长格式的?? 大家来帮帮我想想?应该怎么样来删除呢!!!! 各位用VB.net的兄弟,请问你们使得是 Beta1 还是 Beta2 ? 迷周星弛的请来签名啊! 如何操纵RichTextEdit控件??? 我得到GIF图像的这一点的值,怎样得到它的正确的RGB值? 我想请问在CHTML(compact html)中如何对页面进行刷新。 各位老大,你们是如何找到工作的? 在VB.net中,如何实现VB6中的 set A=createobject("XXXX.XXXX") 诸位大虾救命,如何在EDIT控件中判断DBCS字符 !!求救!!对时!!! 在VC中使用Crystal report 8的问题 如何编写c程序自动对GIF图片设置大小 请教:鼠标在windows桌面上按键是否会引发某个事件? 查看DLL的输出函数 menu的问题 web的组件由什么来编写? 嵌入式数据窗口,怎样可以动态往里插数据窗口??? 在DELPHI中如何调用NETBIOS的API函数 AddNew 怎么用?- 怎么办那,啊? 问题标题前的绿色的对号是什么意思?是不是表示问题已经解决? 怎么学VC啊,菜鸟的菜菜的问题啊。 关于打印比较 提取汉字的拼音 四级挂了,给分,气死了 难题时时有,把它问诸位,不知哪位高手,今日肯帮俺------解决送个人照片(不知各位肯要否?) 刚考完英语四级,来这里发泄一下。同时送上300分! PHP和JAVA如何通讯? 请问哪里有 soft-ice for 2k 如何将字符串的首尾空格去掉??? 1分钟求解:与HEX()对应的把16进制转换成10进制的函数是什么? 怎样判断某个控件是button、edit还是combox、listctrl......? VB.NET(VS.NET)/Beta2正式版下载地址与安装方法 有人用VsPrint吗? delphi、vc、c++ builder三者,哪一种是你的最终选择,why? 第一次上来灌,宋粉 关于C编译后的几个文件后缀名. 请教各位,主要用于办公和工程预决算,用AMD的Duron+km133(集成savage4)行吗? delphi、c++ builder、vc三者,哪一种是你的最终选择,why? 程序结束时,窗体和内存的释放问题 1x(1+2)分之2+(1+2)x(1+2+3)分之3...1+2+.9)x(1+2+.10)的10次方 解方程 8.8x-2.4x=3.2 4.6x+5.4x=10.89 3(x+1.解方程8.8x-2.4x=3.24.6x+5.4x=10.893(x+1.7)=9.6(x-4.5)6=31.8 关于x的方程4x-a²x=2-a有无数解那么a=? 2分之1X :3=(X+1):9 求X 求1/5X+1/4X=1/5X+8+1/5X方程的解法 x-5分之2+4分之一等于八分之五,方程怎么解? (170-x)*3/1-4/1x=10怎么解 求(4x-10)=5/7(5x-8)的详细解法,要小学水平,谢谢! 八分之七x等于六分之一乘八分之五 1-2/1x(1+2)-3/(1+2)x(1+2+3)-4/(1+2+3)x(1+2+3+4)-……-10/(1+2+3+4+5+6+7+8+9)x(1+2+3+4+5+6+7+8+9+10) 5X的方+4X-2=09999X的方+2X-1=0,已知X的方+X-1=0,则X的三次方+2X的方+2005=?(m^2-1)x^2+mx+1/4=0 X*8%+(60-X)*9%=5 求解这个方程 得数等于40 25分之6比X=50,解比例 还有4分之1X+5分之1×45=12 4x+2.5x*(x十0.85)=13.5 方程的解 (x+2+x)×5÷2=40 这个方程怎么算 X+5分之1X=25分之12 若-2^2+5x-2>0,√4X^2-4X+1+2|x-2|=? 方程 1+40%x=4分之5(要过程) x-6分之1x等于5 x+4分之3等于21 (1+3分之1)x等于12求过乘,和怎么算出来的, 4X-3=5X+6紧急! X的2倍与9的和等于-3,方程是 x+4分之1X=1.5 6分之5/[1-(4分之3+12分之1)]答对我采纳额外加30悬赏 -3- (6+5x)= -4x+1 十x-3等于9方程式求解答 x+4/1x=5怎么解方程 若方程kx2-4x+3+0是关于x的方程,且有实根,则K的非负整数值为? 一个数的二分之一比这个数的25%多10.这个数是多少?方程解 解方程:(22-X)*4分之1-5分之1X=1 若关于x的一元二次方程kx2+4x+3=0有实数根,则k的非负整数值是 根据下列条件列出方程:一个数的5倍比这个数大10;一个数的5倍与9的差等于这个数的一半;某数比它的7倍小2一个数与4的和的3倍比这个数大5 x-3分之1x=0.36解方程 【QUICKLY】当k取什么值时,关于x的方程kx2+4x-2=0只有正实数根?.应该很简单的 只可惜ME思维短路1.当k取什么值时,关于x的方程kx2+4x-2=0只有正实数根?kx2乃kx的平方! 10分之3和5分之1的和等于一个数的4分之3,求这个数.(用方程解) 写题即可计划产量:实际产量:24吨(比计划增产3分之1)甲,乙,丙各有若干张邮票,甲的邮票是乙的3分之2,乙的邮票是丙的4分 解方程2分之1x+25%=10 若关于x的方程k(x^2)-4x+3=0有实数根,则k的非负整数值是?过程写下 10/9X-66=6/1X 这个方程怎么解? 解方程 3分之1x+4分之1x=3分之2 x-0.75x-0.25=1 0.8x-14.7=1.3 1.2÷4分之x=5 3.6x+5.3=16.1 当k是什么整数是,关于x的方程kx2+4x+12=0与x2-2kx+k2-7k-16=0的根都是整数 x-5/1x=10/7这个方程式怎么解 当x为何值时 (5x+1)/2-3x比式子(7x-5)/3的值大5? 已知方程4x-3m=x-6m+1的解在1和负1之间则满足条件的整数值为( ) 顺便分析下 方程10.1X加38.6=54.3加9.55怎么解 解方程x(14-x)x1/2=24 若方程X^2-4X+3M=0,与X^2-X-6M=0有一个根相同,求M 3分之2x÷5分之3=15 解方程 x+4分之1x=7.5 1x+3.6=11.2怎么解方程? 已知关于x的方程4x-3m=2的解x=m,则m的值是 若关于x的方程x+2=a和2x-a=3a有相同的解,求a(1/2)某学校在援助边远山区活动中,原计划捐书3000册,由于学生的积极响应,实际捐书3780册,其中初中部比原计划多捐了20%.高中部比原计(2/2)划多捐 2分之1x=4分之3解方程 已知关于x的方程4x-3m=2的解是x=m,则m的值是 关于x的方程2x-3a=1的解是x=a,则a=? 解方程:5/8X-21/8=5/4 已知关于x的方程4x-3m=2的解是x=-m,则m的值为( ). 诺关于X的方程x+2=A和2X-4=3A有相同的解,则A=?急 8x/3分之4=5分之3-2解方程我快急死了..... 方程5(x-1)²+4x=0 求b²-4ac 已知方程组2x-3y=2-3a,3x-4y=2a-1的解满足x>0,y 1x(1+2)分之2+(1+2)x(1+2+3)分之3...1+2+...9)x(1+2+...10)的10次大大 -11-6x=7+8x -3+2-7=4x-15-8x ( 解方程)7x-6-8x+12=-3x+9-3+2-7=4x-15-8x 方程x²+4x+1=0的根是
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn