【第22期】观点:IT 行业加班,到底有没有价值?

Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类

转载 2012年03月29日 17:52:04

转自:http://www.android123.com.cn/androidkaifa/687.html

三、在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反射一样的处理机制,希望大家明白这个道理。  

举报

相关文章推荐

Android NDK开发之JNI基础知识

JAVA层与JNI层数据类型的对应 下面是一个测试方法 [code="java"]public native void test(char c,short s,byte by,int i,long l,float f,double d,boolean b,String s...
  • iaiai
  • iaiai
  • 2015-11-21 13:05
  • 304

android面试题大全

本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 1.listView的优化方式 重用convertView viewHolde...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

android NDK/JNI-实例开发流程

NDK/JNI02-实例开发流程 <a class="fc03 m2a" title="Android_NDK" href="http://yueyue3d.blog.163.com/blog

Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类

转自:http://www.android123.com.cn/androidkaifa/687.html三、在JNI中构造和实例化Java类 public class AndroidJniDemo4...
  • GEOLO
  • GEOLO
  • 2011-01-28 21:35
  • 2234

android ndk jni 实例1

1、检查所需文件是否齐全 使用第三方动态库,应该至少有 2 个文件,一个是动态库(.so),另一个是包含 动态库 API 声明的头文件(.h)&lt;wbr&gt;&lt;/wbr
  • wsql
  • wsql
  • 2012-12-11 16:23
  • 334
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)