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

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

设置计算机名称-VB资料 深入SERIPTING RUNTIME LIBRARY-VB资料 '识别常数的简单四则运算-VB资料 实现平面工具栏 -VB资料 使程序不在 Ctrl+Alt+Del 弹出的对话框内-VB资料 VB使用 API 开始屏幕保护 VB使用rdoPreparedStatement实现参数化查询 使用Vb5制作Easter Egg 使用VB实现所见即所得功能 使用VB中的SERIPTING RUNTIME LIBRARY VB使用Win95的动画光标 VB使用Windows内建的图标 VB使用Word的“艺术字”工具 VB使用WriteFile 块读/写数据 VB使用枚举变量 VB使用数组做属性 VB使用未安装的字体 输入限制确认-VB资料 熟悉VB的集成开发环境 鼠标取词-VB资料 谈变VB中APP.PAHT的注意事项 探讨高效的排序合并算法-VB资料 剔除INI文件中的注释部分-VB资料 提取可执行文件中的图标-VB资料 添加记录到文档菜单-VB资料 突破 SendKeys 的限制-VB资料 突破SendKeys的限制 -VB资料 圖面背景透明的技巧-VB资料 退出并关闭 Windows-VB资料 托盘程序详解(二) -VB资料 托盘程序详解(一) -VB资料 请教各位大虾两个Sql语句 哪里有visual studio.net下载? 那里有sql server 2000企业版下载的 xml的学习??????双儿 怎么比较两个LPTSTR字符串啊??? 语句“rs.Open sql,conn,1,1”中后边的两个数字参数是何意思? 如何获取datawindow中文本框内容? 请教公司大院网络系统设计方案要怎写?会遇到什么问题? 关于clientdataset的返回值问题 关于报表打印的问题!火急。。 这个世界上有多少C/C++程序员? 关于ARP广播域的问题????????????????、 请问什么服务器支持global.jsa 安装oracle数据库出错!!!!!!!!!!!! 如何在对话框的OnPaint()函数中得到该对话框的窗口大小? 一个看似简单却很棘手的问题,不得不请教各位。。。 哪里有将rm文件转换成avi或者mpg格式的软件? 关于ARP广播域的问题?????????????? 请问,,怎么设定mshflexgrid的属性,使其各列的宽度与数据源字段的宽度一致 请问这几个对象是否代表同一个对象? 菜鸟问题:如何跟随鼠标拉出一虚线矩形框?回复就有分! 高分寻Authorware v6.0 注册码 在数据窗口中有“部门”和“员工”两个列,分别采用各自的下拉数据窗口显示。如何使得“部门”改变时,“员工”显示与其对应的人员而不是“员工”表中所有人员。 怎样安装UNIX? 灌水加求救…… T-SQL中SELECT句中可不可以有存储过程。。。。。。。。这样为什么不行呢?(100分酬谢) MS SQL SERVER 有谁知道型号为CDU111-NE 的SONY光驱是多少速的吗? 谁对RTTTL格式文件了解,怎么把它转换成可以发送的二进制格式? 关于ORACLE存贮过程的迷惑,请各位大侠解惑! 请问如何向ActiveX控件发送一个自定义数据结构的指针 有没有好一点的ASP上传组件?? asp调用dll失败!!! 为何用了2个以上的单元有调用窗体就出现 access violat at address XXXXX in module的错误 请问有没有一些用来专门用作软件测试的测试软件? EPSONSTYLUS C20SX 型号的打印机支持NT4吗? 请问哪里有linux操作系统的源代码下载?谢谢 哪几种服务器支持global.jsa 关于数据绑定控件的问题。 关于TIFF文件的处理 DLL动态调用的问题,应注意些什么? 有关错误提示问题的文件存放在哪里呀 vf怎样求2个日期类型的差值?象sqlserver的datediff一样。 一个程控交换问题。 请教各位高手,如何在程序中模拟鼠标点击行为,大大加分!!!!!!!!!!!!!!!! 关于一个消息参数的麻烦………………求救高手! 我在微软的网站上下载了一个DCOM的例子,但不能在两台机器上运行? chinajordan(超飞人)请进!!!!!!!!!!!!!!!!!!!! 如果你是sql语句的高手,请看 请问,有谁知道上海华冠电子设备有限公司怎么样的,谢谢! 怎么把一个控件的坐标转换为它的容器坐标!? 汽车、电动车一般都要使用铅蓄电池.某铅蓄电池用的酸溶液是溶质质量分数为28%的稀硫酸.若用1840克溶质质量分数为98%的浓硫酸,配的稀硫酸溶液的质量为多少克?配制该稀硫酸时,需要水多 fruit(水果)是可数名词还是不可数名词 新铅畜电池加入电解液为什么相对密度会下降啊? hot的中文意思 物理人会沉到水中是因为人的密度比水大吗? 保温防火岩棉和防火岩棉一样吗 Hot的中文含义 当河水内的泥沙量增加时,其密度为何会变大? 防火岩棉 密度120和80的混在了一起 怎么区分出来120的 只有两包 堆在里80的里面 不称重的话 怎么把它们找出来 hot stuff的中文意思是什么? 由于长江上游的植被受到破坏,造成水土污染,河水中的泥沙含量增加,使得河水的密度( ),河水对堤坝的压强( )为什麽?说明理由下!谢谢拉! fruit和food是可数名词还是不可数名词,后面要加S吗?There are many fruit and food.fruit和food在这个句子里是可数名词还是不可数名词,后面都要加S吗? hot 中文意思 1.由于长江上游的植物受到破坏,造成水土流失,河水中的泥沙量增加,使河水的密度_,河水的堤坝的压强_2.当过堂风前后窗子打开时,过堂风会把侧面墙上的衣柜门吹开,这是以为衣柜外_,衣柜内_ 铅酸蓄电池电解液要加多少 hoT 的中文意思 由于长江上游植被受到破坏,造成水土严重流失,河水中的泥沙含量增加,使河水的密度( ) ,河水对堤坝的压强( )由于长江上游植被受到破坏,造成水土严重流失,河水中的泥沙含量增加,使河水的 船用启动铅酸蓄电池 有单格电解液密度非常低,不到1.1.是怎么回事.什么原因导致的?怎么解决. 蓄电池在汽车启动后还有哪些作用(请专业人士或相关技术人员回答,具体点) 外墙保温用的玻璃丝棉板,容重应该用多大的?优缺点有哪些?外墙用这么低的会不会脱棉啊?现在的玻璃棉有憎水的,效果好不好? 铅酸蓄电池电解液详细的配制方法?如果用一斤密度为1.5的硫酸,需要加入多少(重)的水.密度才能降到1.28? food fruit等词什么时候作为可数名词什么时候作为不可数名词?包括drink,我需要的是解决这类问题的方法及判断方法 salad,ice cream在什么情况下是可数名词,什么情况下是不可数名词啊比如:我有几个冰激凌是可属还是不可数? 我有几盘沙拉是可属还是不可数? 提问时:Do you like icecream 还是icecreams? 怎么样计算建筑保温层的厚度 fruit是可数名词吗,说什么指水果时不可数指水果时不可数可指有多少种水果时可加S,最好有例句给我看 如果配制汽车用铅蓄电池中溶质质量分数为30%的稀硫酸500g 需要溶质质量分数为98%【密度为1.84g\cm】的浓硫酸多少毫升? 谁知道屋顶保温层厚度该如何计算? fruit、vegetable、food、dessert哪些是可数名词 我急需啊!明天就要用!麻烦了解决了我会再加分的! 汽车、电机车一般要使用铅酸蓄电池.某铅酸蓄电池用的酸溶液是溶质质量分数为30%的稀硫酸,先用1L溶质质量为98%的浓硫酸(密度为1.84g/cm3 保温层厚度怎么计算 说的详细点 有公式吗、‘?就是建筑的外墙的保温 food,vegetable and fruit 是不是可数名词? 请问保温棉是玻璃纤维棉吗,掉身上很痒的那种? 计算保温层厚度相关数学问题D2LN(D2/D1)=0.277514求D2D2=D1+1 电动车一般都要用铅蓄电池.某铅蓄电池用的酸溶液是溶质质量分数为28%的稀硫酸.若用1000毫升溶质质量分数为98%的浓硫酸(密度为1.84克每ml³)来配置溶质质量分数为28%的稀硫酸.(1)1 汽车的蓄电池可以直接加98%的硫酸吗?汽车的蓄电池可以直接加98%的硫酸吗?汽车的蓄电池可以直接加98%的硫酸吗?汽车的蓄电池可以直接加98%的硫酸吗? 岩棉,玻璃丝棉,玻璃纤维棉 是不是都可以用做保温和吸音材料? hot的对应词 汽车蓄电池的硫酸浓度是多少 英语翻译Compressed packing with PP.16 batts/pack 430mm wide. hot反义词或对应词 fruit是可数名词吗? 防火岩棉板容重偏差允许是多少?有国家规定吗有规范吗 英语“these"的对应词是什么,hot 的对应词是什么 河水中的泥沙含量增加,使河水的密度(),河水对堤坝的压强() 理由 ice cream ,salad作为可数名词时的复数是怎样的 带hot的词 泥沙不溶水 为什么河水密度大于水化学题上说饱和食盐水中再加盐 密度不变 因为食盐再不溶解 那泥沙也不溶解在水里 为啥含泥沙的河水密度大于水或者说 再加入了食盐但不溶 密度变了吗 图纸上只写屋面保温材料用5.5厚硬质岩棉板,请问该用多少容重的,需不需要憎水性的岩棉板. 词语搭配!Hot!无锡惠山 趵突泉山东济南 蝴蝶泉云南大理 华清池山西临潼 跑虎泉浙江杭州 二 泉开始是连线,现在 汽车电瓶蒸馏水加多了,对电瓶有没有坏处,蒸馏水和电解液一样吗 岩棉板用在上人屋面上,压缩强度需要达到多少,以及憎水率 玻璃每立方米的容重是多少吨,钢化玻璃和普通玻璃的容重一样吗? 电瓶里面有硫酸也有电解液{蒸馏水},但是在加的话哪里圆硫酸?哪里又是加电解液的?电瓶里面的硫酸和电解液是分别加的哪里的?打开那个小盖子后是应该加蒸馏水的吧! 蓄电池在充电时电解液密度如何变化 12毫米玻璃容重是多少?(急) fruit是可数名词还是不可数名词? 汽车蓄电池电解液密度降低了有什么不好 玻璃幕墙的容重是多少? fruit是可数还是不可数名词? 25摄氏度的铅酸蓄电池电解液的密度是1.28,那么温度降到10摄氏度的话电解液的密度还会增加吗?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn