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

Android JNI实例代码(二)

HTML文档下载 WORD文档下载 PDF文档下载
Android JNI实例代码(二)

作者:Android开发网


   我们继续Android JNI开发中的常用代码,第二部分将包含如何在JNI中构造实例化一个Java类以及异常处理的具体方法,有关前一部分的内容可以查看 Android JNI实例代码(一)  。

   三、在JNI中构造和实例化Java类

 public class AndroidJniDemo4{
 public static native void constructClass(); //JNI方法
 public static void main(String[] args){
  AndroidJniDemo4.constructClass();
 }
}

class CwjThread implements Runnable {
 int nCount = 0 ;
 public void run(){
  try{
   Thread.sleep(1987); //休眠1987毫秒
  }catch(Exception e){
   e.printStackTrace();
  }
  System.out.println("Count="+ nCount);
 }
}

JNIEXPORT void JNICALL
Java_AndroidJniDemo4_constructClass(JNIEnv *env, jclass clazz){
 jclass jclazz , cwjclazz; 
 jmethodID mid , mid2 , runmid ;
 
 jobject obj , obj2 ;

 jclazz = (*env)->FindClass(env, "CwjThread");   //查找Java层的类

 if (jclazz == NULL)
 {
  return ;
 }

 mid = (*env)->GetMethodID(env, jclazz,"<init>", "()V"); //构造CwjThread类
 
 if (mid == NULL)
 {
  return ;
 }

 obj = (*env)->NewObject(env, jclazz, mid, NULL); //创建该类的实例,生成的新对象为obj

 cwjclazz = (*env)->FindClass(env, "Ljava/lang/Thread;"); ////得到Thread类

 if (cwjclazz == NULL)
 {
  return ;
 } 
 
 mid2 = (*env)->GetMethodID(env, cwjclazz,"<init>", "(Ljava/lang/Runnable;)V"); //获取Runnable方法ID
 
 if (mid2 == NULL)
 {
  return ;
 }

 obj2 = (*env)->NewObject(env, cwjclazz, mid2, obj);  //构造Runnable对象

 runmid = (*env)->GetMethodID(env, cwjclazz,"start", "()V");  //获取Runable对象的start方法ID
 
 if (runmid == NULL)
 {
  return ;
 }

 (*env)->CallVoidMethod(env, obj2, runmid);   //执行start方法在JNI中,来启动线程

 (*env)->DeleteLocalRef(env, jclazz);  //我们并没有使用NewLocalRef有关本地引用的内容Android123在 Android JNI开发终极篇中将详细讲述
}

上面的代码可能我们发现JNI中构造一个类比Java层麻烦的多,需要先获取ID,测试是否为空,然后编写类方法的构造和类型签名符号,多了很多这样的操作,不过Android开发网提醒大家毕竟JNI中没有类的声明引用,只有动态获取这些方法的ID所以执行效率可能比Java还有所降低,类似Java反射一样的处理机制,希望大家明白这个道理。    

 四、JNI中的异常处理实例代码

 class AndroidJniDemo5 {
 private native void createException() throws IllegalArgumentException; //JNI中抛出一个参数不合法异常
 private void throwException() throws NullPointerException {
  throw new NullPointerException("Java error, android123 "); //Java中产生一个空指针异常
 }
 public static void main(String args[]) {
  AndroidJniDemo5 ajd5 = new AndroidJniDemo5();
  try {
   ajd5.createException(); 
  } catch (Exception e) {
     e.printStackTrace();
  }
 }
 static {
  System.loadLibrary("AndroidJniDemo5");
 }
}

下面的JNI中的异常具体代码

JNIEXPORT void JNICALL
Java_AndroidJniDemo5_createException(JNIEnv *env, jobject obj)
{
 jthrowable throwable;
 jclass clazz = (*env)->GetObjectClass(env, obj);
 jmethodID mid = (*env)->GetMethodID(env, clazz, "throwException", "()V"); //获取Java中的throwException方法ID
 if (mid == NULL)
 {
  return;
 }

 (*env)->CallVoidMethod(env, obj, mid); //执行throwException方法

 throwable = (*env)->ExceptionOccurred(env);  //有异常发生,其实Android123提醒大家还可以使用JNI中的异常检测ExceptionCheck函数来判断

 if (throwable)  // 如果发生了异常
 {
  jclass newExceptionClazz;
  (*env)->ExceptionDescribe(env);
  (*env)->ExceptionClear(env);

  newExceptionClazz = (*env)->FindClass(env,"java/lang/IllegalArgumentException"); //实例化一个参数不合法异常

  if (newExceptionClazz == NULL)
  {
   return;
  }
  (*env)->ThrowNew(env, newExceptionClazz, "JNI cwj exception"); //在JNI中抛出异常
 }
}

 最后我们可以看到在JNI中处理很多事情确实需要编写很多代码,同时有关类的构造符号什么的,目前的IDE和编译器无法检查,所以Android开发网提醒大家一定要记住Java签名符号的格式和规范,下一次我们给出一些例子,帮助Android NDK初学者快速了解JNI的规则。

透过KitKat,Android或与ChromeOS融合? 利用Spring Data Neo4j搭建推荐系统 七丽借百度SiteApp移动化 分发及变现能力获大幅提升 Go语言4岁了 生日快乐 谷歌发布Web延迟基准测试工具 专访JS-Git创始人Tim Caswell:让Git运行于任一平台 一段代码引发的思考 2013年美国开发者薪资调查报告 MDCC之移动娱乐游戏峰会:金玩奖揭晓最火游戏 算法为王:且看Mac Mini如何超越1636节点的Hadoop 鲍尔默成大善人?微软正式废除员工排名评审制度 工信部软件司副司长陈英为MDCC 2013大会致开场辞 全民移动•重塑世界 2013移动开发者大会盛大开幕 泯灭Web App可用性的七个开发错误 保益互动创始人曹军:听到的世界更精彩,盲人应用背后的故事 Gumi公司CEO国光宏尚: 大公开!日本手游市场攻克方法! Great Hill Partners高管Chuck Goldman &amp; 南京创毅CEO William Wei:超越黑莓——下一代企业移动 高通业务拓展副总裁沈劲:智能手机2.0——以体验为中心 百度副总裁李明远:百度轻应用——长尾APP的最佳选择 中国工程院院士李德毅:大数据时代的认知计算 创新工场联合创始人汪华:2013年中国移动互联网进入深入区 百度副总裁李明远:解答关于百度轻应用的八大疑问 谷歌推出PNaCl,帮助开发者在任何硬件和网站上运行代码 阿里云:双十一350亿交易额的幕后英雄 索尼移动智能设备全球技术总监Goran Andersson:索尼移动可穿戴设备解决方案 腾讯社交网络事业部副总裁陈磊:腾讯移动开发者服务体系 基调网络副总裁陈靖华:全面掌握移动应用性能 蓝港在线创始人王峰:手游新时代下的机会与挑战! Couchbase CEO Bob Wiederhold:数据库云端同步,移动应用开发的未来 三星电子大中华区副总裁黄伽卫:构建移动互联生态,解读内容服务新方向 MDCC 2013移动开发者大会:新浪潮,新硬件! 请问:系统崩溃后,找不到BOOT,系统告诉:DOS基本分区为格式化?无法引导启动! 在VB.NET的tabcontrol上放置AxMSFlexGrid控件问题,急 java3D 现在大家是用Oracle 8还是 Oracle 9??? C++问题求助! 请教一个错误的原因. 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版 SCJP里的那些什么300-020,020是什么意思啊? 请问一个关于document.write()方法的问题。急啊! 初学者,欢迎灌水。 Delphi6的Bug?不兼容? 为什么我用GetProfileString()却总是得不到结果 sos 请教各位大侠一个问题 delphi6中的installShield 请介绍接收端CRC校验传输内容是否正确的方法,资料或代码。谢谢! 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁会做软件狗?有钱赚了!!! 为什么我用QuickRep作的报表只能显示一条记录,而且columnHeaderBand上内容也显示不出来 请问在税务局开发数据库的同行么?? 大家好各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁做过软件狗,马上来拿钱!!! 江苏省的成绩什么时候可以出来啊,我是徐州的 shockwaveflash没有hwnd,怎么办? chechy(chechy) 你在吗? 一个关于用excel做的日报的问题 谁会做软件狗,马上来拿钱!!! 给你下跪了,给你磕头了,给你鞠躬了。很简单的问题。谢谢 那位大哥能告诉我在VC中我要创建类的话应该做哪些工作步骤(要详细的,呵呵) 紧急求救,asp连接mysql问题 在使用twebbrowser的时候,怎样制止网页的自动刷新和跳转? vc编译器错了怎么办???突然死机,然后就不好好干了!!谢谢 ?如何将二进制的 值写如注册表? Delphi紧急求助! 我想问的是,返回的 ResultSet 中的某个字段(int 型),如何放到一个 int[]数组里去。因为 ResultSet 不知道怎样取 size,我又不想用 vector, ResultSet的getArray()方法也是莫名其妙。 c盘格式化后,怎样找到linux系统? 有意思 过来研究一下!!!!insert 的!!!!难道 25 不是 long integer 吗 我的程序debug版,一直调试好好的,我rebuid all 一下就出错了,错误如下:怎么回事? 位图问题? 怎样使用自定义的光标??? 我想找Hopen SDK的开发包。 为什么我的iis总是报500内部服务器错误。我先装的framework,后来升级了ie5.5,最后在w2kprofessional上装了iis,手动添加了aspx解析:指向aspnet_isapi.dll,为什么还报错? 那里有关于用组件上传图片并且显示上传图片的介绍 NT 上已安装好mysql服务器,WIN98 client连接不上,求救 程序员梦难圆,请大家给我这个非计算机专业的兄弟出出主意。 小弟是delphi初学者,师兄师姐们给我介绍一下object pascal自带的函数好么? 你知道如何禁止后退按钮吗? 请各位高高手!解决启动时ctrl+alt+del可结束任务的问题。 哪位大侠指点一下ActiveSkin怎么用的? 引用ado后,打包程序为什么如此之大 为什么我的iis总是报500内部服务器错误。我先装的framework,后来升级了ie5.5,最后在w2kprofessional上装了iis,手动添加了aspx解析:指向aspnet_isapi.dll,为什么还报错?? 散源代码(1)- 货郎担问题(TSP)分枝限界算法 压力容器由锅检所检验质量,膨胀节的质量检验工作由哪个部门来做 描写春天、夏天、秋天、冬天景色的四字词语有哪些?2008-12 5亿美元是什么概念? 我单位欲取A2类压力容器制造证,不知哪位权威人士知道需不需要办理压力容器设计分包协议! 描写春天、夏天、秋天、冬天风景的谚语最好多一点分类我会奖励分 古代人利用什么工具来测量和观察天气变化? 压力容器分为一二三类,分为高压低压中压容器、分为反应、换热、分离、储存容器,这些关于压力容器的分类,有哪些法规依据呢?麻烦亲列举一下 知道台风预警信号中哪个颜色的台风信号最弱吗? 农村春天夏天秋天和冬天各有什么景物 市场调查的应用范围是什么 春天一般是多少度之内?夏天、秋天、冬天呢?一般多少度之内代表是这个季节了? 压力容器的效验周期的多长?压力管道(蒸汽管道)的周期?压力容器(空气储罐)的效验周期? 21.根据《广东省突发气象灾害预警信号发布规定》,悬挂 ____预警信号时中小学应该停课.A.暴雨橙色 B.暴雨红色C.高温橙色 D.高温红色 气象台在发布台风预报时,除了有时间、风速、风级以外,还强调了什么? 压力容器与压力管道的特点 气象部门发布的气象灾害预警信号,危害程度最高的是哪种颜色 气象台已经发布台风橙色预警信号了.教育局怎么还不放假? 200克食物的概念是什么啊?举例说明下 上海发布过哪些突发气象灾害预警信号 你知道气象台以发布台风预报时,除了有时间,风速,风级以外,还强调什么呢?你能说出其原因吗? 200克蘑菇是多少,没概念 算盘是我国传统得计算工具是褒义词、贬义词还是中性词阎王好见,(小鬼)难求!是中性、褒义、贬义 气象台在发布台风预报时,除了有时间、风速、风级外,还强调() 我们通常在冬天吃火锅--英语--句子 他的小算盘打得很精是褒义词还是贬义词还是中性词 压力容器安全技术监察规程规定哪些容器需办理使用证 2000万象素是个什么概念?我家有个600万象素的佳能相机,一直没怎么玩过数码相机不知道2000万象素是个什么概念呢?和600万象素的差距到底有多大希望相关人士给一些简单易懂的答案 中性词,褒义词,贬义词快 (固定式压力容器安全技术监察规程)属于国家标准吗 把一个阻值为20欧姆的电阻丝 接到电压为u=200sin(31.4t+30°)V的交流电源上求:1 电阻上电流的解析式2电阻丝发热的功率 算盘是我国传统的计算工具是褒义词还是贬义词还是中性词?在线回答提高财富悬赏,复制的不采纳. 中国古代测量时间的原理和玛雅人测量时间的原理是相同的吗? 发热圈如何计算功率一发热圈已知电阻式40欧,电压380 可以算出它的功率吗? 天气预报的预警信号的眼色如何区分?天气预报中的预警信号的颜色如何区分? 我国古代利用日影测定时间的工具称之为什么? 发热功率怎么计算? 天气预报中的多云和晴有什么区别我们这里高达39度的温度,居然还说是多云?暗道多云不是阴天的感觉吗 春天,夏天,秋天,冬天各像什么? 压力表是多长时间一检验?液化气储罐上的是半年一检,有标准规定吗?还是文件规定的?有的企业把不重要位置的压力表列为一年一检. 天气预报中的“阴”和“多云”有什么区别? 春天的树是花儿们选美的舞台,那夏天的、秋天的、冬天的树是什么呢 英语关于四季的优美句段越多越好, 压力容器安全技术监察规程》的适用与不适用范围是什么? HT200材料淬火硬度可以达到多少? 压力表的校验周期按周期校验,安装后一直未使用(6个月),校验时间能否顺延至实际使用时间?我是说校验周期能否以实际使用时间开始算半年后校验. HT200灰铸铁怎么配料及比例是多少 HT200具体介绍下,HT200是什么材料?200表示什么? 压力容器安全阀和压力表效验周期分别是好多呢? HT200铸造原材料包括什么?具体包含哪些元素?各元素的所占含量比例? 气象台向公众发布灾害性天气预警信号有什么意义 压力表校验周期可以缩短吗? HT200性能有何特点?举例说明其用途. 天气灾害分为几种? 在1970年的美国,200亿美元是一个怎样的概念 计算工具的演变 气象灾害预警信号是由哪三部分组成 5千万亿美元是什么概念? HT200成分是什么?急用 200分贝的概念是什么啊?举个例子.详细点! 假如你有200亿美元,你会?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn