打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JNI攻略之八――操作对象的构造方法

JNI攻略之八――操作对象的构造方法  

2006-12-18 17:14:02|  分类: JNI |字号 订阅

JNI攻略之八――操作对象的构造方法

江苏 无锡 缪小东

      本篇主要介绍如何在JNI中,构造一个java对象。通过本章的学习大家会发现构造java对象基本和调用java对象的方法一致。

一、         操作构造函数

       下面是一个包含创建某个对象的本地方法。

public class ConstructorAccess{

       public static native void callThread();                //创建java对象的本地方法

       public static void main(String[] args){

              ConstructorAccess.callThread();                //调用本地方法

       }     

}

 

class ThreadTest implements Runnable {                 //辅助的线程

       int i = 0 ;                                                  //局部变量

       public void run(){

              try{

                     Thread.sleep(2000);                          //线程休息

              }catch(Exception e){

                     System.out.println("Error !");

              }

              System.out.println("This is the "+(i++) + "th's sleep");             //打印线程休息的次数

       }

}

 

 

       下面就是包含构造某个线程对象的本地方法。

#include <jni.h>

 

JNIEXPORT void JNICALL Java_ConstructorAccess_callThread(JNIEnv *env, jclass cls){

       jclass jcls , threadcls;                                      //ThreadTestThread类的类

       jmethodID mid , mid2 , startmid ;              

                                   //ThreadTestThread类的构造方法和Thread实例的开始方法

       jobject obj , obj2 ;                                    //ThreadTestThread类的实例

 

       jcls = (*env)->FindClass(env, "ThreadTest");             //得到ThreadTest类的类

       if (jcls == NULL) {          return ;   }

       mid = (*env)->GetMethodID(env, jcls,"<init>", "()V"); //构造ThreadTest

                            //JNI中,构造器其实就是一个名称为"<init>"的方法

                     //返回值为void

       if (mid == NULL) {         return ;   }

       obj = (*env)->NewObject(env, jcls, mid, NULL);        //创建该类的实例

 

 

       threadcls = (*env)->FindClass(env, "Ljava/lang/Thread;");              ////得到Thread类的类

       if (threadcls == NULL) {        return ;   }

       mid2 = (*env)->GetMethodID(env, threadcls,"<init>", "(Ljava/lang/Runnable;)V");

                                                                                           //达到构造器的方法

       if (mid2 == NULL) {              return ;   }

       obj2 = (*env)->NewObject(env, threadcls, mid2, obj);             //以刚才创建的ThreadTest对象

                            //为参数,使用Thread类的new Thread(Runnable r)创建类

 

       startmid = (*env)->GetMethodID(env, threadcls,"start", "()V");  //得到线程类的启动方法

       if (startmid == NULL) {          return ;   }

       (*env)->CallVoidMethod(env, obj2, startmid);                   //调用start方法启动线程

 

       (*env)->DeleteLocalRef(env, jcls);                                  //释放资源

 

} 

 

二、         总结

       在上面我们分析了JNI如何操作java对象的属性、方法和构造方法!这些java对象可以是在JNI本地代码中创建的,也可以是通过JNI本地方法的参数传入的!传入的这么做啊!请仔细看看本地方法在.h文件中的表示,第二个参数就可以了!(明白了吧!不明白多看几遍哦!同时还要看Signature)。

       这三篇我们讲述了在JNI中操作Java对象。下篇将讲述如何在JNI中处理异常。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android JNI开发高级篇
JNI官方规范中文版——如何访问Java中的字段和方法
当JNI遇到多线程--java对象如何被C++中的多个线程访问?
Android JNI实例代码(二)
Java如何使用JNI提取平台及硬件信息
列举一些Android的JNI开发技术
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服