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开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段

(1 String类型的属性读写class AndroidJniDemo2 { private String sTmp; private native void readwriteField(); p...
  • GEOLO
  • GEOLO
  • 2011年01月28日 21:34
  • 1373

Android-本地方法C调用Java中的方法/NDK-JNI开发实例(六)

流程:  点击button按钮调用本地方法,本地方法中使用C调用Java中的show()方法; 生成方法的签名: 打印方法签名 项目名-->app-->build-->interm...

Android-本地方法与Java相互调用-自定义ProgressBar(锅炉压力监测例子)/NDK-JNI开发实例(七)

流程: 点击“开始检测按钮”Java调用本地方法startMonitor(),并启动一个线程,本地方法使用C来实现;本地方法的实现 产生随机数传给Java中的show()方法,show()方法中调用M...

Android-调用本地方法计算int数值相加结果显示在界面上/NDK-JNI开发实例(三)

Java调用本地方法计算int数值相加,得出的结果显示在界面上; test1.c // // Created by y_ulongji on 2015/8/31. // #include JNIEX...

JNI/NDK开发指南(八)——调用构造方法和父类实例方法

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中调...
  • xyang81
  • xyang81
  • 2015年03月01日 21:18
  • 5730

Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)

本地方法使用C与C++的实现代码是不同的,且.h头文件必须引用; 在生成jni文件夹同时将生成.h头文件放在该目录下、命令: 进入项目名-->app-->src-->main-->java 目录下...

Android-调用本地方法将小写字符串转成大写字符串/NDK-JNI开发实例(四)

Java调用本地方法将小写字符串转成大写字符串; test3.c // // Created by yulongji on 2015/8/31. // #include #include /...

android Jni NDK开发环境搭建及其简单实例的编写

android  jni-ndk开发, 环境搭建:http://blog.csdn.net/nxh_love/article/details/30993255 实例参考文章:http://...
  • rong_wz
  • rong_wz
  • 2015年03月22日 13:45
  • 420

Android-调用本地方法实现将C进程分支出来即生成系统进程/NDK-JNI开发实例(九)

流程: 点击button调用本地方法,使用C实现本地方法;C实现方法中分支出C进程; 如何在本地方中打印LOG; build.gradle配置 : defaultConfig { ...

android NDK/JNI环境配置及实例开发流程

来源:ITEYE 作者:daixj110 一cygwin安装 cygwin精简版下载地址:http://down.51cto.com/download.php?do=co...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
举报原因:
原因补充:

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