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

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

数据分析≠Hadoop+NoSQL,不妨先看完善现有技术的10条捷径 移动周报:百度收购91,19亿美金背后的博弈 植物大战僵尸2:“免费+内付费”模式引发争论 [CTO俱乐部第103期] 高德和四维图新技术高管谈地图导航的发展与挑战 Java 7爆最新漏洞,10年前的攻击手法仍有效 Twitter联合创始人Biz Stone谈Facebook用户体验 提倡零广告 英雄会:企业的人才漏斗 开发者的武林大会 一次错误估算带来的启示 苹果开发者中心被黑:开发者信息或被窃取 SIM卡加密存漏洞 将影响数亿计的手机用户 搜狗茹立云:探索引擎产品落地 浏览器+搜索模式会成主流吗? 大势所趋,IBM Acme Air至少使用Netflix的5个开源工具 【观察】跨越“朦胧期”的云计算:产业、核心技术、生态圈以及突破点 Rovio Account:平台化之路修成正果 甲骨文总裁马克•赫德采访实录:用软硬件集成一体机打垮对手 如何一步一步打造高可扩展性的应用程序? 用Java编程,请保持简洁! 从安全隐患带来的商机来看,Hadoop同样很美 三年增四倍:如今谷歌服务占北美互联网流量四分之一 决战低功耗?Intel明年推低功耗Xeon处理器 在软件架构上增加新功能的注意事项 90后的代码界“女神”李雪:在编程中找到自己的“灵魂” 大数据之路不乏荆棘,然则其中的机遇却高于一切 iPhone销量令人意外:苹果Q3财季净利69亿美元 同比下滑 励志:12位早起的IT大佬们让小伙伴们都惊呆了 独家:苹果5周年限免神作,BADLAND开发者访谈 10亿次订阅!苹果Podcast的里程碑 免费利器Unity 4.2正式发布 支持WP8、Win8和BB10 SDCC 2013:Pinterest首位中国籍工程师两场演讲议题确定 甲骨文公布中国首届“Duke选择奖”名单 Moco、X幻想、开源中国获奖 直接拿来用,10个PHP代码片段 将html文件存放在备注字段中,然后再输出可以吗? 如何控制一个文本框的内容随另一个文本框的内容变化而同步变化? 一个关于窗口的小问题!!!小弟初学DELPHI请多多指教!! 求助 excel导入数据时出错.高手进 请问role是干嘛的? 自动生成图片 datawind如何与window联系起来啊 存储过程同时调用和数据库异地备份问题? 在xsl中如何调用javascript 误删系统盘,救命!!! 请问ACCP和高程考试相比哪个更有份量? 求LeapFTP V2.7.3.600的注册码 5月6日我来CSDN的二周年,散分,纪念。。。。 listbox (湖南)今年非典搞得这样,会耽误报高程吗?今年有人报了吗?怎样报的? ComboBoxEx在 SetImageList 时出错 在DBComboBox中脸上数据库后,为什么进行选择时会出现“违反了Primary 约束“ 关于传递多值的问题 如何从recordset得到数据库的行号 用<%@ include file="xxx.jsp"%>出现的怪问题!求教 有关server.mappath()的问题 J2EE基础问题两三问,追加200分。 问题很简单,但我很急,请帮忙各位。 可用的UDDI 急救!自动隐藏Panel 帮忙 哪里有数据库系统开发的文档下载 急待解决的问题 请问从socket发信息,连续发送几个小数据包出错的情况!! 紧急问题,在线等待! 救命——存取违例 请问在VB中使用DAO控件怎样打开ACCESS数据库? 请问装vc6的sp5主要有什么作用啊 双网卡的局域网,如何让 CSocket 使用指定的网卡与另一电脑通讯? SQL删除不了相同的记录 JBuilder7中的中文问题 谁知道计算机的本地时间与系统时间有什么区别? 请问如何实现垂直显示文字?` JDOM高手看过来! 请问怎么在vb中调用纯c接口的api并实现多线程 如何实现任意长整数的运算? 程序移植,有多大的工作量??? 哪里有InstallShield Express的中文包D6自带的那个。 HELP ME! 请教:API中的数据类型与pb中的数据类型的对应关系 第一个进来给100分!哈哈,高兴!! 高分求翻译, 高手请进,就一句 TeeChart在那个组件栏中?我怎么找不到?(我是6.0的版本) 在哪里下载KPT7.0? 存储过程问题讨论!高手请进. 芬兰计划实施新禁烟法 拟禁居民在阳台“免费”医疗让俄罗斯进退两难联合国首次主动攻击非洲叛军 或抛弃被\"深井救人\"事迹在百姓中传颂 王\"歼20\"战斗机现身沪昆高速?路刘恺威《喋血孤岛》11月1日浙江教育浙江临海户外休闲用品业节俭办展 小投宁波住博会盛行低碳环保风 市民“凑热安永:中国矿企面临海外并购“机会之窗土库曼斯坦货币20年 发行金银纪念币老司机雾中迷路高速逆行 交警支招大雾温州关停淘汰159家电镀企业 10人美新书爆料奥巴马怕应酬克林顿 难独自肯尼亚少女遭多人强奸 嫌犯仅被罚剪草摩根大通:今明两年中国跨境并购将非常美国务卿回应监听活动:某些方面“太过王毅强调:一定要打造好海外民生工程美使馆神秘“白盒”遍布全球 德媒称其澳大利亚警方追捕偷车贼 造成路过少年日本政府拟制定相关措施援助海外核爆受巴西副总统特梅尔将于11月4日至10手串新选择,椰壳也不错孜明:投资就是永远走在寻找下一个的路万余人奋战“夹岩” 投资已超20亿毕节市开展农村思想政治教育活动特辑(本月底贵州本土首家航空公司举行首飞(容易陷入前任阴影的十二星座今早9点毕都高速通车!水城到毕节只需为什么第一印象总是这么重要?喵星人的白日梦:朕要这样过周末和父母争吵,正说明你们彼此在意发现孩子的百分之二,教育就成功了中国海军护航编队开展武力营救被劫商船承德冰雪温泉国际旅游节开幕 集竞技民广东怀集黄氏族人拟筹资修建黄维清纪念工信部官员:最担心“中国制造2025“飞雪”狂欢过洋节 云南大理古城一片首届粤港澳温州人大会在穗举行 三地温吃核桃可别扔了最珍贵的东西--核桃分阿森纳圣诞当天依然坚持训练小罗:内马尔是我的继承人卢卡斯:杰拉德的更衣柜依然空着
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘