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

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

继BAT之后 第四大巨头是谁 如果传统IT部门真的消亡,你该何去何从? 闪存突袭,混合储存是否已步入黄昏 Cloudera发布Hadoop开源组件Sentry:提供细粒度基于角色的安全控制 我从其他Shell脚本中学到了什么? 10个调试和排错的小建议 机器学习的时代来临,人类应该做点什么? 云端测试破1500万 Testin已为开发者省2亿 智能腕表inWatch:已发售近3600台 Bingo!微软证实Windows 8.1将捆绑安装Skype IBM宣布收购以色列网络安全公司Trusteer 约10亿美元 如何才能运作好一个开源项目? 为什么JavaScript有能力成为未来企业级编程语言? Red Hat CEO:拥抱开源 拥抱克隆 小米手机-HAXLR8on硬件黑客马拉松 开团了! 移动周报:雷军做红米的N个理由 Pangea Software CEO:08年App Store游戏降价大战的真相 揭秘MongoDB最新Java驱动:更好的JVM支持,指日可期的异步 不仅只有IE Mozilla将于发布Win8平台Metro版Firefox 360搜索发布新产品“我的搜索” 引入网民评价和网站名片功能 AppScale:Google App Engine的开源实现 近期十大优秀jQuery插件推荐 通过语音识别来编程 速度远超键盘 BrowserStack:多系统跨浏览器兼容性测试工具API发布 更加开放?Path向13家应用开发商开放API 重金力邀开发者 联想智能桌面应用开发大赛开幕 SDCC 2013大会讲师名单议题出炉 8月20日五折票价最后一天 程序员困境:底层编码能力正逐步丧失 寓教于乐 给代码审查者的几点建议 裁员4千、总裁员人数超过7.5万,难掩思科锋芒 物联网离普罗大众还有多远? 紧急求救 想知道各位WINDOWS下用什么SNIFFER? 对于网络上的第三方控件的看法 简单问题?JTable中的数据如何居中对齐,有没有直接的函数(不用自定义CellRenderer) 有关析构函数 请问一个小问题 关于ADO中ltBatchOptimisticr的FilterGroup的问题 两个星要到多少分才能升到三个星呀 请问有谁知道北京的成人教育大致的情况如何? 是VC编译器不符合ANSI C++,还是?? 我现在在写个程序!是关于证券方面的!可是如下的一个小问题如何解决?? ★★如何让excel的某行的值等于另一行的值乘以一个固定值(急问,在线等待)★★ @@@开学了,散分! 怎样构建一个LDAP服务器和怎样使用 用VFW采集时进行压缩的问题。求解 C# 在DW MX中如何进行层定位? 回复:機會不要錯過! 華強科技有限公司幫你成就軟件工程師的夢想! How to access SMB/CIFS from Sun workstation? 谁来拿分啊。我有一个问题自己解决了,但没有给分的对象。 问一个message Bean的问题,up有分 [EJB]HelloWorldBean正确编译配置和执行,但"HelloWorld"却不见了 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何让主界面变成三维的那种 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 用什么组件能得到网站上的末知大小的文件? 问一个简单的问题 还是有问题关于获得选中安钮的当前行,请进>> 请教简单问题,如何将菜单的一个选项隐藏。就是类似cb的将Visible=false的做法!! 连接ACCESS数据库的问题? 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何提取一个EXE文件的特征码??要高分者和高手进!!!!来者有分! j2ee配置问题,大家帮我看看,错误出在哪里?谢了! 如何在注册表中修改使得浏览的网页可以即时通过工具栏的“编辑”调用DW修改? "聊聊"网站是怎样建的?用拉什么技术,可以即使聊天? 类型转换,非常奇怪的问题。高手进来 搞纯C++的大虾请进 关于MDI Child窗口的一个问题? DOS6.22的下载及6.0源码 sql语句问题:怎样从表中选出字段值包含在一个变量字串的那条记录。100分!在线等待! 关于那个mesh绕自己中心(注意是自己中心)旋转的问题我还没有解决 抛砖引玉: 证券行业软件之数据库存储。 如果下面这个问题谁能解决,我跪下来拜他三下:在WIN2000里,通过更改注册表,以达到更改IE的页面设置(一定要能更改横向:orientation和 过程的问题!!! 一个非常难的问题---挑战这里所有的高手!(解决了,分数我可以追加到200) 用vc7时候怎么导入一张图片作资源?还有怎么添加popup菜单 有关取得一个Tree Control的一个Notify的问题! 关于delphi中用ADO连接数据库的问题!!(欢迎up)在线等待! 急问各位高手,在CB里怎么设置数据库的相对路径。 有一份北京的工作,需要懂php+mySql+linux,有兴趣的请和我联系 请问能否把报表预览控件中的“CLOSE”安钮改成中文的”关闭“安钮? 甲乙两个人同时从A、B两地相向而行,5分钟后两人相遇,相遇后两人继续前行,又经过15/4分钟,甲已超过B地20米,而乙离A地还有80米,A、B两地相距( )米.希望不要用二元一次方程等复杂方式解答. 纸对折30次有多高 观察植物的作文9000字 如何改进英语教学 一张纸对折30次,真的能高过世界最高峰么?随便什么纸,对折30次真的能超过珠穆郎玛峰吗? 抄6篇600字左右的作文大概需要多少时间? 妈妈呀,妈妈 这是一篇阅读短文!认真阅读下面短文,完成下面的练习.妈妈呀,妈妈 “哎呀,我的小祖宗,别动别动,让我来做.”这话简直成了妈妈的口头禅了.我放学一进家,她便让我做作业,我干 如何珍惜粮食简短些 拟一副对联,教师节 这种题目什么的最讨厌了,特别是阅读短文完成练习. 什么是数字PID位置型控制算法和增量型控制算法? 下面关于印度地势特征的描述,正确的是 A.中部高,南北低 B北部山地 中部平原 南部高原我急用 一小时内 速度我们老实说选A 但又貌似不对 A不对吗 读短文,完成练习的题目,公鸡和狐狸狐狸见公鸡站在树上,它像想吃鸡,但自己又不会爬树.于是它说:“啊,公鸡,我告诉你一个好消息!”“什么好消息!”公鸡问.“哦,现在所有的动物都成为好 pid控制的算法 《渔家傲 秋思》中戍边将士对家乡的思念的句子 帮我起一个练舞蹈作文的题目 怎样用PID算法控制温度? 地理中河流左右岸怎么判断南北半球方法一样吗 请问小学英语适合利用英文歌曲进行教学吗? 甲、乙两数相加,结果为357.5,如果甲数的小数点向左移一位,就和乙数一样,那么乙数是( ). 地球与太阳相隔多远? ph试纸哪有卖 100吨米等于多少千牛米?寻求达人 废旧纽扣电池怎样处理才好? 成都ph试纸哪里有卖? 汽车发动机功率和牛米的关系汽车发动机的大问题,功率和牛米的关系,都说看发动机的性能看功率和牛米,发动机的综合性能是功率越大牛米也越大,但如果 100KW-200NM和120KW-180NM,那个发动机更好 下列对联最适合用于祝贺教师60周岁寿辰的是(  ).A.为学有宗花甲成庆,诲人无倦恩重及门B.花甲有二犹在拼搏,赢得称颂留传万年  C.碧桃献岁宜家受福,古稀逢春获寿延年D.执掌教 哪里可以买到PH试纸,价钱如何? 《那一刻,我迈上了新台阶》作文的开头不要是这个:人生漫漫,每分每秒,我们都在台阶上攀登.每登上一层,我们就站得更高;每登上一层,我们就看得更远——台阶总是在我们的脚下延伸. 废旧的纽扣电池不能随意丢弃,应( )进行回收. 茄子内涵是什么意思 建筑给排水图纸上出现一个箭头,箭头上标注1%, 旧电池有什么危害?告诉一下! 根据提示补写名句.1.我寄愁心与明月,( ).2.( ),天涯共此时.3.疏影横斜水清浅,( ).4.纸上得来终觉浅,( ) .5.勿以恶小而为之,( ).6.千年扬州古运河,堪称一条诗歌之河,你是否在课内外 将一张厚度为0.05毫米的纸对折30次以后,猜一猜它能有多高?我是初中生,这是家作啊,快.要理由.后面的答案要带单位. 在发展社会主义市场经济中,政府如何解决社会就业问题? 等个茄子是什么意思? 一张纸对折30次有多高 手表纽扣电池可以用多久?我在2012年过年时买了一个卡西欧的手表,200多块,冒牌的,我想知道它有没有可能是自动的?如果不是,里边的电池能用多久.用了一年半,该不该换了? 一个6位数,各个数位上的数字之和是17,则这个数是多少,最小是多少 一张O.3毫米的纸,对折30次,那它有多高? 手表里的纽扣电池,有50块钱那么贵吗?我的手表是比较好的那种,不过是别人送的,牌子是CYMA的我前几年 最贵的也就20,没想到这次换的居然是50,不知道是否真的有那么贵的纽扣电池 一个三位数,三个数位上的数的和是17,十位上的数比百位上的数打5,个位上的数是百位数发2倍,求这个三位数. 用0.1毫米的纸折叠30次有多少米 手表里的纽扣电池是锂电池吗 初中地理教学视频我现在初三了,可是地理总是考的不好,我非常苦恼,我不知道该怎么办,请问我应该怎么学呢? 印度的山地印度北部的山地是__东亚五国的岛国是_,它是由_,_,_,_等四个大岛和数千个小岛组成的,其中面积最大的是__,纬度最高的是__岛.按地理方向,亚洲分为_,_,_,_,_,_,其中东亚五个国家有_,_,_, swatch手表的纽扣电池问题手表用了2年了 今天突然没电了 拿着原装的纽扣电池去买 到处没有卖的 最后没办法 找了修表的师傅拿了两个小的纽扣电池对到一起安进去了(原来的电池是一个的 涉及的范围是否比较广呢? 印度地形分文三部分,北部为高大的是什么山? 冷榨和压榨哪个好 如何提高初中地理教学成绩 甲数的小数点向左移动两位就和乙数相等,甲数比乙数多47.52,甲数是多少?如题 冷冻脱腊是冷榨吗 甲乙两个人同时从A、B两地相向而行,5分钟后两人相遇,相遇后两人继续前行,又经过4分之15分钟,甲已超过B地20米,而乙离A地还有80米,A、B两地相距( )米. 甲数的小数点向左移两位后和乙数相等,甲数和乙数比,()大,大()倍 5篇600字作文多长时间抄完 查成语什么日经济 范仲淹的《渔家傲》中,表现壮志未酬、怀念故乡心情的句子是( ),( ) 抄一篇500字的作文大概要多久?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘