您的位置:首页 > 移动开发 > Android开发

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

2012-03-29 17:52 746 查看
转自: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反射一样的处理机制,希望大家明白这个道理。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐