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

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的规则。

唏嘘不已!Brendan Eich上任Mozilla CEO仅十天即因歧视同性恋被迫辞职 最火HTML5 JavaScript游戏引擎:国外篇(一) Facebook发布PlanOut 开源部分A/B测试源码 一周消息树:6款Java转C#的最佳工具、Web开发者必备的9个软技能 对话“宙斯杯”获奖代表:依托京东云平台,打造精品电商CRM 关于微软开源WinJS,开发者必须知道的5件事 告别丑陋banner条,InMobi联合开发者尝试原生广告 免费游戏开发经验谈:第一印象很重要 《近匠》小旭音乐:游戏音乐金牌匠人的练级之路 日600亿消息,月4.65亿用户——WhatsApp的Erlang世界 一周热点:Cloudera新一轮融资总额已达9亿美元 【走近院士】李未:实现云服务的有效方法是群体软件工程 大神云集 大型创客聚会2014深圳Maker Faire盛大开幕 直击Maker Faire,将精彩“一网打尽”! 电池革命:超级充电器来袭,30秒为手机充满电 风雨13载,Windows XP今起正式退役 向Facebook看齐,Twitter收购Android屏幕待机应用开发商Cover 绝对的超现实!Jaunt打造360&#176;全景VR电影 Unite China 2014课程解析:行业解决方案专场免费开放 Manhattan,Twitter规模的实时、多租户分布式数据库 Ceph浅析(中):结构、工作原理及流程 孙元浩:基于Spark引擎的高速内存分析和挖掘工具应用 腾讯私有云背后的团队,品高要做企业云计算的产品经理 撼动企业应用架构的十大技术趋势 Airbnb的管理之道:产品设计的点评策略与技巧 Windows 8.1 Update 1的下载地址和八点须知 《近匠》棱镜:手游渠道SDK平台的技术历程 OpenSSL究竟为何物,为何它的影响力如此之大? Redis大冒险:如何跳出SQL这个坑 【走近院士】张尧学:基于透明计算的云操作系统 微软转型之路:从Build 2014开始 redhat9.0是否支持ich5 在VS2002中可以用的设置星期格式的代码,在VS2003下不能用,为什么? 请教一个关于时间的SQL语句! 关于多级菜单问题 我的电脑里的chm文档打不开了,求救~~~~~~~~~~~! 购买QQ,共1000分(1) 大家帮忙分析一下 请教,关于“name not Unique in this context”的错误。50分,急!!!! 请教一个小问题 显示属性打不开? 购买QQ,共1000分(2) 很简单的问题,最好详细写listput 这个组件怎么用? 80分够不?在线等待中。 改好了告訴我一下,等0點去機房,這邊的認證服務器不動了,VMS系統我不懂 MIDAS 高手请进,这个问题在大富翁上出了600分,也没人拿到,难道真的没人明白吗? 女儿三岁生日,酬宾 关于PHP GD库的问题. jsp主要做什么的?菜鸟问题 为什么会重复显示两次? 怎样恢复类! 有没有人可以帮我的,55 如何把DBF文件导入到SQL2000里? 我想将一个字符串(用户密码)加密,有没有好的算法,请大家指教 熟悉化境编程界HTTP上传程序的请进! 我想将一个字符串(用户密码)加密,有没有好的算法,请大家指教 局域网搜索时,怎样连上要搜索的机子 如何分辨用户是通过在URL栏输入地址,还是点击链接来到本站网页。 好了,我把数据库清理一下,你继续改那几个参数,LOG文件太大先不要管 问题! “多步 OLE DB 操作产生错误。。。”怎么解决?? 急!!! 哪里有内存泄漏检测工具? 请问如何将80*60象素的图片文件转换为120*90象素的图片文件 哪位兄弟试过把csdn的文档里面的文章全部下到本地看的? APL和DOL表的区别?在系统中怎样设置(运用)?最好有示例。多谢先! 如何在一个函数内部知道这个函数的名字? “多步 OLE DB 操作产生错误。。。”怎么解决?? 急!!! _RecordsetPtr对象的Find方法怎样用? 等會過來喝點咖啡吧,今天晚上一定要測完 一个简单的fork问题(那个高手来帮忙呀) 一个关于安装的问题 在VC中用什么函数运行一个程序?像vb中的shell.比如运行QQ.exe 继续散分 急招游戏软件合作伙伴(美国项目外包) 有关更新表中的记录,有没有简洁的办法? 散分的理由 那位大侠能告诉我这是什么原因。Error 404--Not Found 研究生题目,大家试试,帮帮忙 新手问题! 请教EXCEL的公式问题? (高手请问:)linux下访问非本网段的一台主机 哪位兄弟试过把csdn文档栏目里面的文章全部下到本地看的? 哪位高手有中国象棋棋盘控件的开发文档 求Alicia Lemke-trip the light MP3格式, Alicia Lemke -trip the light 求分享一下哈有无损格式的么?有的话最好也分享一下,感激不尽! settle a space in a twinking at your happy time! 求Alicia Lemke – Trip The Light one day Peter says to his mother,“Mum,everyone in our class says I have a big head.” Then he cries(哭).“Don’t listen to them,my son .You have a beautiful head,” his mother says,“Now,don’t cry.Let’s go to the shop and buy some apples sam says to his mother这句话表述有错吗? ostrich是可数的吗 水泊梁山上的杏黄大旗上写的四个大字是什么?如题. 水泊梁山上的黄杏大旗上写着的四个大字是什么? 水波梁山上的杏黄大旗上写着的四个大字是什么? Did you tell your mother all you had seen on theway home 义乌集装箱数10年增70多倍 义乌成杭州市公述民评进入第三场 市民拷问地杭州孩儿巷取消52个泊位后道路通行明杭州凤起东路将继续往东延伸 唐家村桥浙江省首次公开省级部门决算及“三公”杭州规定企业拒绝工资集体协商将最高被韩媒:朝鲜军工厂和军列连发火灾 或系党校专家:三中全会部署政治体制改革国研中心:设自贸区不需时间表 成熟一环球时报:决不让暴恐分子制造社会隔阂土耳其已否决“采购中国红旗导弹”的早重庆晚报记者北京见证千万富豪诞生北大资源·家装大讲堂为你装修支招明清贸易瓷见证中外文化互动一汽丰田杯高原拉力赛重庆发车“反法西斯是日常生活的一部分”保监会8大指标为保险公司服务评级身陷囹圄的房地产开发商体坛速递珠子溪仙女梨花带雨 仡佬族逍遥世外桃看大腕 中国乒超总决赛落户重庆渝中搭建民心天网
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘