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

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

W3C小组发起新“汽车与Web平台业务组”项目 苹果CEO:请忘掉股价 未来依然有伟大产品 两周营收100万,GO桌面在Google Play做对了什么 “吸金王”Puzzle &amp;amp; Dragons是如何炼成的 初创公司Kickboard:让父母了解孩子的在校表现 Rackspace收购开源数据库公司ObjectRocket 投资人表示微软应推出iPad版Office 三星:谷歌养大的一匹狼 UC九游年度战略:2013计划分成超3亿元 X-Canvas:UC将发布高性能HTML5游戏引擎 淘宝:OceanBase分布式系统负载均衡案例分享 Cloud Foundry面临代码分支 策略为王股票软件VC源代码简介 StarCraft开发:用肮脏的技巧解决难题 忠于用户:美团1000亿的卫星与Groupon的窘境 360周鸿祎开放日回应质疑:都是做搜索惹的祸 轻量级的高性能Web框架:Play 为什么会失败?社交鼻祖Friendster的“验尸”报告 那些年Google公开的大数据领域论文 遍地撒网,重点培养,King.com颠覆性游戏商业模式 Adobe正式发布Photoshop Touch图像处理应用 2013年全球重要黑客大会一览 Gartner:2013年公有云将增长18.5%,达1310亿美元 开源炫彩界面库简介 一周消息树:我的十年编程自学之路 移动搜索状态:谷歌称雄 仍有较大发展空间 移动周报:我为什么弃用Objective-C而选择RubyMotion? 2月浏览器排行:IE高歌猛进 Chrome创17个月新低 Twitter创始人:最好的程序员大多是自学成才的 Evernote遭到攻击,5000万用户密码重置 VC++开源项目:P2P播放器AVPlayer 请问高手:我想做一个表格,按下表头各列,表中数据能进行排序,表中数据来源于数据库!!! 如何获得ie窗口内的地址文本框的句柄和内容? 在客户端缓存了EJBHome,为什么过一段时间就不能用了 沉默是金,放荡会成空。 如何动态(自动)调整数据窗口列间距? 急急急急急急急急急急急急急急急急急急急急急急急急急急急 请赐教:在app“非法操作”并关闭后如何把app原来在内存中的数据写回数据库或文件中呢??? 请问哪里能下载到《设计模式》的电子版本?pdf或html都行!谢谢了! 在PB8下面,MAIN窗口的MAXBOX = FALSE ,我设定这个窗口一打开的时候就最大化,为什么在这个窗口打开之后双击TITLE,窗口就变成了我设计的 CSDN论坛到底怎么了??? 一个和sql server连接问题? OO设计还有哪有原则? http://edu.sina.com.cn/l/2002-03-14/21924.html(看看吧~!!!多惨啊) 请问c的n次乘方函数是什么? 请各位大侠指教,关了类型转换的问题 学习Jive源代码要从那里入手 ★★★快来抢100分★★★:在bcb6里,我用import activex control添加组件怎么提示错误:E2347 Parameter mismatch in write access ?? 大家给推荐几个MM喜欢的小游戏吧 如何在一个基于对话框的界面上添加一个view 一个关于两个网页之间的传递及表单生成问题,请教! 在c/s之间,数据处理的问题 vb中的类的多样性,怎么表现出的? 谁能告诉我DELPHI6.0安装盘的序列号.送分,thanks!!! UFO 的秘密!最新发现,足以推翻以前任何种学说,想知道UFO真正的面目者,进来看看。 菜鸟问高手,如何在一个多文档程序中,关闭子窗口? 关于漂亮虫虫的疑惑 如何移动edit控件,使用什么函数?谢谢 servlet和JSP有何区别?(菜鸟级) template class declare? 请教一个很菜的问题,赶快请进 高手看过来,关于ipc的问题! 怎样在listbox中保存信息? 刚刚学习ASP,请问在哪里可以下载ASP的资料!!!!! swing中哪个类可以用作ToolBar中的按钮? 要能显示图象的 template 怎样更改trichedit鼠标指针样式? 我正在寻求仿XP菜单的源代码或控件,不知道哪位高手有????(email:zhem8@yeah.net) 关于创建不规则窗口的问题,请一定帮忙。谢谢!我只有100分了~~~~~~~~~~~~~~! 用cdonts发邮件时为什么把附件发到了内容当中,都是乱码,应该怎么改? Coledatetime同oracle8中的date类型相同吗? 关于操作系统 怎样拦截某个控件的消息? 请问怎么不加lib档又可以编译做好的dll?? 请问DivX的使用 请问有谁研究过USB接口的驱动????? 简单问题:怎么给我满意的答复加分呢? 救命啊。。。 9行程序崩溃WIN2000/xp 太、太、太好了!连帮助都是中文的,还可以继承、多线程,盗版比正版还提前发布。 关于C++的构造函数的问题 初学java网络编程的问题 做匀速直线运动的物体甲和乙,甲的速度是乙的4倍,乙走的路程是甲的1/3,那么乙用的时间是甲所用时间的( )倍. -OH 和-COOH的区别就是碳氧双键使羟基氢更活泼吗?求正解… 为什么纯铁比生铁软,是什么因素导致? 用医用消毒棉轻轻堵住自己的耳道,听-一听周围的声音,有什么感觉?然后用手将双耳尽量堵紧,感受一下周围的声音,和刚才相比感觉一样吗?为什么? 2012年1月30日翻译成英文是怎样?(不要简写,全写,就连月份也全写) 用量筒量取一定体积的液体时需要用胶头滴管吗? 天那水加什么溶剂慢干?知道的朋友请帮一下…… 1,冬天手冷时,用嘴慢慢地向手上哈气时,手会感到暖和些;若用力向手上吹气,手不但不感到暖和,反而觉得更冷.试一试,并用物理地语言说明其中的道理.2.小明和小红都想帮妈妈煮粥.小明认为 钢的含碳量比生铁的含碳量少,而钢比生铁硬,所以含碳量越少,则铁合金的硬度越大,所以当含碳量为零时硬度越大,则纯铁比钢和生铁硬,而合金比它所含的纯金属硬度大,这是矛盾的,那这是为 往Cu(NO3)2溶液中加入一定量的铁粉,充分反应后,有金属析出,过滤洗涤后往滤渣中加入稀盐酸,有无色气体放出.下列正确的是:A.滤液中一定有Cu(NO3)2和Fe(NO3)2B.滤液中一定有Cu(NO3)2,可能有Fe(N 谁能帮我看下这是什么植物化石好像我等级不够你能去我百度空间看下吗 什么性质的 油漆 或者 颜料,用天那水或酒精之类的 溶剂都洗不掉油漆或颜料 是涂在木板上的有没有什么办法在颜料或油漆上进行处理(不能用烘烤的),使之不怕溶剂的清洗,而又不影响效 开水壶怎么清洗 请问这是化石吗?植物化石值钱吗? 高达模型渗线是先消光还是渗完再喷消光,需要加深刻线吗,溶剂是用ZIPPO油好还是田宫专门的珐琅漆溶剂好呢 珊瑚化石有价值吗 各种化石价格,分开说,比如鱼化石,鸟化石,植物化石等,大概价位是什么样的? 英语缩写(要20个)须20个,格式如NBA 全美篮球协会 如何清洗开水壶 描述CH3-CH=CHC≡C-CF3分子结构的下列叙述中,正确的是 A、6个碳原子有可能都在一条直线上.B、6个碳原子B.6个碳原子不可能都在一条直线上。C.6个碳原子有可能都在同一平面上。D.6个碳原子 某地一株千年古槐已经空心,但依然枝叶繁茂、古槐“空心”空去的主要是茎中的( )和( )的一部分.感激不尽,要期末考了………… 这是什么化石?今天在山上拾到的,象田螺;如图: 已知:① 在稀碱溶液中,溴苯难发生水解 ②两个羟基同时连在同一碳原子上的结构是不稳定的,它将自动发已知:① 在稀碱溶液中,溴苯难发生水解 ②两个羟基同时连在同一碳原子上的结 1.某导体接在电压为3伏的电路中,通过它的电流为0.15安,若把它接在6伏的电路中,导体的电阻是多少欧?2.在50℃时氯化铵的溶解度为50克,回答下列问题:(1)如用30克水,需加氯化铵多少克?(2) 什么化石? 下列分子结构中,原子的最外层电子不能都满足8个电子稳定结构的是A CO2B CH4C PCl3B SO2请给出原因 哪些描述天气?哪些描述气候1、受南下寒潮的影响,本市将会明显降温2、这几天朵朵白云漂浮在蓝天上,美极了 这块木头化石有价值吗? 化学式为C5NH4OH,分子结构是苯环上的一个碳原子变成氮原子,并连接了一个羟基的化合物名称 Ca(OH)2溶解度为什么会随温度的降低而升高?不要说是因为物质的特性,这我知道.我要的是具体的解答 琥珀还是化石 有价值吗石头里面有个 大豆芽 是什么东西啊 石头是半球体 切面是平的 里面的大豆芽十分清晰 颜色也很清晰 浩繁的星空,天体之间相距遥远.例如,地球到太阳的平均距离为1个天文单11位(AU),1AU=1.496x10 m,若不考虑地球大气层等因素对太阳光传播过程的影响,那么,太阳光可以看成是沿____方向传播到地 溶解度随温度升高而变小到的物质有哪些,除了Ca(OH)2 把足量的铁粉放如硫酸和硫酸铜的混 合XIEXEI 把足量的铁粉放如硫酸和硫酸铜的混合液中,充分反应 残留的固体质量与原来加入铁粉质量相等,则原溶液中H和的SO4物质的量只比为多少 (1)敲击桌面时可以听到桌面发出的声音,却很难看到桌面的震动,怎样说明桌面发生时在震动?(2)把一个鼓平放后,在上面放些纸屑,然后敲打鼓面使之发声,你会看到什么现象?说明了什么?( 写出下列化合物中的氢元素化合价 进行高到低排序 冷却结晶和蒸发结晶有什么区别 植物化石值钱吗?比较完整,鉴定约是一亿年前的. 溶解度跟溶质的质量分数 有什么不同? 蒸发浓缩冷却结晶是重结晶吗1 蒸发浓缩,冷却结晶=重结晶?2: ①蒸发浓缩,冷却结晶 ②蒸发结晶,趁热过滤 ③重结晶 都是得到晶体的方法吗? 植物化石 值多少钱 胶头滴管20cm一次可以吸多少毫升 沙能溶解在水中吗我要写“报告”哈~ 维生素c的结构式中看到醇羟基与碳碳双键相连,这种结构稳定么? 滴管胶头怎么装 沙子在水中溶解时颗粒的分布是什么的 维生素C有羟基、双键、酯基、这些官能团决定了维生素C有哪些性质实验呢? 甲乙两机械,甲的机械效率是70%、乙的机械效率是50%,下列说法中正确的是( )A、使用甲机械做功省力 B、甲机械做功快C、相同时间内,甲机械完成的功多 D、乙机械的额外功在总功中占的 KCL在NaCl溶液中溶解度会变吗? 刘丽同学上课回答问题时的收声频率是450赫,它表示的意思是 化石的价值 已知20℃Kcl溶解度34.0g,若把20gKcl放在20℃时的50g水中,溶解度完全后可得Kcl溶液 这是植物化石吗,有收藏价值吗 化石的研究价值在哪? 物理题目 初二一个质地均匀的物块放在水平桌面上,如图3所示.1.若沿aa线将它切成2块,拿去上部分,物块对桌面压力( ),压强( ).2.如果沿bb线切,拿去右边部分,物体对桌面压力( ),压强( 为什么有了一个羟基后羧酸就的碳氧双键就无法加成?RT 硫酸亚铁溶液中加入酸性高锰酸钾溶液方程式 初二上学期关于速度物理题2010年12月22日10时,宜万铁路在恩施举行首发仪式.正式通车.宜万铁路修建中最难的是齐岳山隧道,如果一列火车长300m,以72km/h的速度通该隧道,9分钟后通过求:(1)齐 一个碳连一个双键氧和两个羟基的物质酸性为什么弱于乙酸 胶头滴管 滴出 液滴 的大小的问题我想到一个问题`用胶头滴管滴出不同溶液的液滴大小是一样的吗?如果不一样`液滴的大小和什么有关`?或者之间存在个什么关系?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘