Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
2011-01-28 21:35
821 查看
转自: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反射一样的处理机制,希望大家明白这个道理。
三、在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实例代码(三)-- 在JNI中构造和实例化Java类
- Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- android下NDK开发环境搭建及TestJNI入门实例完整过程
- [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法
- Android-java调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(二)
- android Jni NDK开发环境搭建及其简单实例的编写
- Android-调用本地方法传递数组参数/NDK-JNI开发实例(五)
- Android-NDK开发之基础--Android JNI开发高级篇(JNI中的常用方法)
- Android-使用Android studio 进行NDK-JNI开发实例(一)
- Android-NDK开发之基础--Android JNI有关Java类命名方式
- Android-本地方法C调用Java中的方法/NDK-JNI开发实例(六)