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

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

支持物联网开发! Qt发布5.3版与嵌入式企业版 5月23日:Java已经19岁啦! Google发布Dart1.4版本,新增Observatory工具 《近匠》Mixtile:跑在盒子中的嵌入式平台 从研发、平台化到营销:移动时代,汽车厂商如何升级? CTO俱乐部“云计算创新与实践”沙龙:云计算的发展趋势与那些“坑” 一周消息树:大型网站系统与Java中间件 良心推荐:6款基于云的移动应用开发工具 Google Project Tango第二弹:可生成3D图像的平板电脑 API企业化战略部署三部曲(一) 高通产品市场经理刘晓光:详解骁龙Android SDK 苹果史上最大交易:斥资30亿美元收购Beats 微软是否应该提高Windows版本的推送频率? 咸鱼大翻身?索尼将发展可穿戴游戏设备 popping:基于Facebook Pop引擎的iOS动画库 《近匠》专访极路由CTO康神 真正智能中心应当这样做 为什么说Android才是游戏开发者的乐土? 开发移动医疗应用必知的10个掘金点 个推CTO叶新江:云推送技术如何助力产品开发 《近匠》Face++:漫谈人脸识别 无线充电技术赛高:随意走动也能电量满格 体验至上!移动Web应用JavaScript UI库App.js 专访中国国航:传统行业的“轻应用观” 开发者找众筹,哪些网站更靠谱? 48小时脑力激荡 中美青年创客大赛英特尔北京选拔赛 “微应用+大平台”推动企业软件走向碎片化 浅谈Hive vs. HBase 十款最新的JavaScript开发工具 JavaScript Promise启示录 百度携多位安全专家深入探讨安全人才快速培养机制 卡饭技术代表严佳:引入安全人才,企业应遵循S.L.E.E.P、S.T.A.R法则 请问在asp中如何读取/显示access数据库中的备注字段 紧急求救:在VC++里如何通过ATL OLE DB访问(INSERT\UPDATE\DELETE\SELECT)ORACLE和SQL SERVER里的BLOB字段内容? 高薪寻找西安的兼职UNIX程序 员 在delphi中,怎么调用api函数? www.alldas.de为什么无法访问了??? 如何检测被覆盖的窗口区域是否发生了变化? 高薪寻找西安的兼职UNIX 程序员 如何制作下拉菜单 请高手指点:好猫为何不工作? 一种设想,20台电脑5根电话线上网,如何达到较快的速度? 对话框程序调试时的问题?!!!! 请介绍几本好用的自学C语言的书籍好吗?? 紧急求救,请高手来看看 .NET和JAVA到底哪个好? 谁来救我?ISequentialStream::write()为何不好使? 定义类型的困惑 大虾们,如何做一个图标选择框!!!(详情见内) ADO编程问题求解!!!!!!!!!!! ****************简单问题,高分求救??????????????????????? 请问怎样在TabStrip中的选项卡中增加图片?谢了 工程如何能建的工整一些? www.alldas.de为什么无法访问了? 关于动态控件的问题 ADO编程问题求解 怎么编程产生1MHz甚至更高频率的周期信号? 紧急求助—有关JMail4.1附件问题 挥泪大送分!!!!! 怎样才能让自己变胖? 做个仅有对话框的应用,但想把它放到托盘, 给ASP爱好者提个建议! 关于SQLserver2000“视图“的两个问题,请教高手! 好久没上网了,送分以庆祝再回csdn!!!!! 做浏览器,如何实现 “后退”,“前进”,这二个功能? 如何使C:盘,D盘的根目录不共享? 用resin时,是否需要jdk,如何配置?分必给! SDI中的某一个子视图里怎样对主窗口的状态栏进行更改?? ◇◆◇ 失恋代表什么? ◇◆◇ 我英语不懂,想考高程.行吗 ◇◆◇ 学生生涯快完了,大家来说说对学生生涯的感受,特别是什么最深刻的! ◇◆◇ 求救!如何把SQL命令从前端应用程序传给应用程序服务器 要去招商行笔试了,有参加过的兄弟给点建议。 ###############讨论一下->微软全力推出.NET技术和C#语言的出现,VC++还有多久的寿命??? 要去招商行笔试了,有参加过的兄弟给点建议 如何发一消息,帮别人问的 高手帮助!!! 要去招商行笔试,有参加过的兄弟给点建议。 要去招商行笔试,有参加过的兄弟给点建议 我配置的IIS,为什么只能读数据库,不能写入?为什么? 我要去招商行笔试了,有参加过的兄弟给点建议。 好久没发帖了……………… 请问LINUX/UNIX下那种扩展名的文件是可执行的?DOS的。EXE对应的格式是什么? 方程2的x次方=3-2x的解为x1,方程log2(x)=3-2x的解为x2,求x1+x2的值答案是3/2,可是我怎么都是2啊? 已知2+根号3是方程x2-4x+c的一个根,求方程的另一个根及c的值 无论x取何值,多项式(m-1)x的3次方+2mx的2次方+(m+1)x+p都等于px的2次方-qx+p,求(m+p)的p-q的值? 已知方程3x的平方+4x的两根是x1、x2,求1/x1的平方+1/x2的平方的值已知方程3x的平方+4x=7的两根是x1、x2,求1/x1的平方+1/x2的平方的值用韦达定理, 设方程2的-x次方=lgx绝对值的两个根为x1,x2,则x1乘以x2的积与0,1的大小关系 已知关于X的一元二次方程x的平方+(m+3)+m+1=0.若X1,X2是原方程的根,且|X1-X2|=二倍根号二.求m的值 若方程X平方-3X-1=0的两个根为x1,x2,则1/X1 + 1/X2的值为 关于x的二次方程2x^2+(log2为底,m为真)x+log2为底根号m为真=0有两个实数根,求m的值两个相等的实数根。。对不起啊,少打两个字。。 x1、x2是方程x^+根号p*x+q=0的两个根且x1^+x1x2+x2^=3/2,1/x1^+1/x2^=5/2,求p、q的值 设方程4x的平方-3x-8=0的两根分别为x1,x2求下列代数式的值(x1-3)(x2-3) x1分之2+X2分之2 (x1-x2)的平方 若关于x的方程(根号x+3)+2x+m=0只有一个实数根,求m的取值范围 方程根号4-x2=lgx的根个数是几个? 设x1,x2是方程2x²-3x-3=0的两个实数根,则x1/x2+x2/x1的值为 已知关于方程x^2+2x+2根号(x^2+2x+2p) -p^2=0,其中p为实数(1)若方程没有实数根,求p的范围(2)若p>0,为p为何值时,方程只有一个实数根,并求出这个根用换元法设根号中为a,我想知道分解因式后 已知X1,X2为方程X的平方加px加q等于0的两根,且X1加X2等于6,X1的平方加X2的平方等于20求p和q的值? 已知方程3x²-4x-2=0的两根是x1、x2求、x1²+x2² 2、1/x1²+1/x2²3、x1三次方+x2三次方. log根号2^(x-5)log2^(x-1) 已知关于X的方程x^2-px+q=0的两根分别为x1,x2,且x1^2+x2^2=7,1/x1+1/x2=3,求p+q的值 已知关于x的方程3x^2-5x+a=0的两个根为x1、x2,且-2小于x1小于0,1小于x2小于3,求实数a的取?、 log2(1+根号2+根号3)+log2(1+根号2 -根号3) 已知关于x的方程x²-px+q=0两根为x1、x2,则-x²+px-q=0等于多少A、-(x+x1)(x+x2)B、(x+x1)(x-x2)C、-(x-x1)(x-x2)C、(x-x1)(x+x1)选哪一个?最好有过程 已知关于X的方程3x^2-5x+a=0的一根分布在区间(-2,0)内,另一根分布在区间(1,3)内,求实数a的取值范围 已知函数f(x)=2^x+x,g(x)=x-log1/2x(1/2为底数),h(x)=log2x-根号x(2为底数)的零点是x1,x2,x3,比较大小 已知三角形ABC的一边长为5,另外两边长恰是方程2x^2-12x+m+1=0的两根,求实数m的取值范围已知方程x^2+px+q=0的两个实数根分别比方程x^2+qx+p=0的两实数根小1,求以1/p,1/q为两根的一元二次方程 已知关于x的方程3x^2-6(m-1)x+m^2+1=0的两个根x1,x2满足|x1|+|x2|=2,求实数m的值 已知x∈[根号2,8],函数f(x)=log2 (x/2)乘以log根号2 ((根号x)/2)求该函数的最大值与最小值,注:这两个对数式是相乘,底数分别是2和(根号2),真数分别是 (x÷2)与 (根号x÷2),在10月23日下午3 已知关于x的一元二次方程x2+px+q=0的两个实数根为p.q,则p,q=? 设x1,x2是方程3x方-5x-7=0的两根.求(1)x1方+x2方=?(2)1/x1+1/x2=?(3)X2/X1+X1/X2=? 已知函数f(x)=log2(2^x+1),g(x)=log2(2^x-1),若关于x的函数F(x)=g(x)-f(x)-m在[1,2]上有零点,求m范围 已知方程x^2+px+q=0的两根是a,b.求证:一元二次方程qx^2+p(1+q)x+(1+q)^2=0的根为a+1/b和b+1/a如题. 设方程3x²-5x-7=0的两根,分别为x1,x2,求一.(x1-x2) 二.(x1-2)(x2-2) 若关于x的方程根号下1-x^2=log2(x-a)有正数解,则实数a的取值范围 设x1,x2是方程x²+px+q=0的两实数,x1+1,x2+1是关于x的方程x²+qx+p=0的两实跟,则p=?q=? 已知,方程3x²-5x-7=0的两个根为x1、x2(韦达定理)求|x1-x2|根据韦达定理x1+x2=-b/ax1x2=c/a 关于X的方程根号下1-X^2=x+a在区间[1,1]上有解,则实数a的取值范围是 若p,q为正实数,且关于x的方程x2+px+q=0与x2+qx+p=0均有实根,求p+q的最小值cdinten 你的答案不对恶,把4代进去就是错的。 已知方程-x2+3x-m=3-x在x∈(0,3)内有唯一解,求实数m的取值范围 使得方程根号(16-x^2)-x-m=0有实数解,则实数m的取值范围?答案是4≤m≤4根号2.这个好像要画图!麻烦给个图解, 方程x的平方+px+q=0的解集是A,方程X的平方+qx+2p=0的解集是B,又AnB={-1},求AUB 若正数a为方程3x^2-5x+3=0的两个根x1,x2的比例中项,求a(我觉得3x^2-5x+3=0这个方程无解) 已知全集U=R A={x f(x)=根号(X-1)(X-2)} B={x log2(X-a) 若方程x^2+px+q=0与x^2+qx+p=0有一公共根,且p不等于q,求(p+q)^2009的值答出来还送积分哦~加油.. 设集合A={x1,x2,x3}={x|x^3=1,x∈C},则集合B={x1x2,x1x3,x2x3}(x1,x2,x3∈A)与A的关系是 已知函数f(x)=log2(x^2-ax-a)在区间(-∞ ,1减根号3]是单调递减函数.求实数a的取值范围 一元二次方程px平方+qx平方+r=0(p不等于0)的两根为0和-1,则q:p= 已知5a的y+5次方b的3x次方,与-4a的2x次方b的2-4y次方是同类项,则x= y= 已知a>0a≠1,试求使方程log2(x-ka)=log2根号下(x^2-a^2)有解的k的取值范围希望得到图象法的解释,谢 已知方程x^2+px+q=0的一个根与方程x^2+qx-p=0的一个根互为相反数,并且p不等于q,求p-q的值. 已知2a的y+5次方b的3x次方与2分之5a的2x次方b的2-4y次方是同类项则x=【】,y=【】 若log2(2-a)/根号(a-1)有意义,则a的取值范围 已知:方程x^2+px+q=0的两个根为a,b,而a+1和b+1是关于x的方程x^2+qx+p=0的两根,求p,q的值. 已知关于x的方程2x^2+(log2m)x+log2根号m=0,有两个相等的实数根,求m的值 设关于方程4^x-2^x+1-b=0,若方程有实数解,求实数b的取值范围 以知关于X的方程 X的平方-pX+qX=0 的两个根是2和-3,求p,q的值. 若方程(1/2)^x=log2(X)的解为x1,方程(1/2)^x=log1/2X的解为x2,则x1x2的取值范围为若方程(1/2)的x次方=log以2为底x的对数的解为X1,若方程(1/2)的x次方=log以1/2为底X的对数的解为x2,则x1.x2的取值范围是什么 方程根号下(4-x^2)=lgx的根的个数是请把步骤写得清楚点,谢谢 如果x=3时,代数式px的3次方+qx+1的值为2008,则当x等于-3时px的3次方+qx+1 若x1,x2为方程【2的x次方=(1/2)的-1/x+1次方】的两个实数解,则x1+x2= 方程根号下4-x^2=lg x的根的个数4-x^2都在根号里 当x=-2时,代数式px的3次方+qx+1的值等于2012,那么当x=2时,代数式px+qx+1的值为多少?错了,当x=-2时,代数式px的3次方+qx+1的值等于2012,那么当x=2时,代数式px的3次方+qx+1的值为多少?四个选项A.2010 B.-201
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn