SlideShare a Scribd company logo
1 of 2
Download to read offline
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;                        //ThreadTest 和 Thread 类的类
      jmethodID mid , mid2 , startmid ;
                               //ThreadTest 和 Thread 类的构造方法和 Thread 实例的开始方法
      jobject obj , obj2 ;                            //ThreadTest 和 Thread 类的实例

      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 ; }

                                                  1
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 中处理异常。


更多精彩请关注:
      http://blog.163.com/miaoxiaodong78/




                                                        2

More Related Content

What's hot

5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
Java多线程设计模式
Java多线程设计模式Java多线程设计模式
Java多线程设计模式Tony Deng
 
jQuery源码学习
jQuery源码学习jQuery源码学习
jQuery源码学习fangdeng
 
NHibernate分享(1) share
NHibernate分享(1) shareNHibernate分享(1) share
NHibernate分享(1) shareXu Huang
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)yiditushe
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)wang hongjiang
 
Object-Based Programming Part II
Object-Based Programming Part IIObject-Based Programming Part II
Object-Based Programming Part IIPingLun Liao
 
從 Singleton 談 constructor
從 Singleton 談 constructor從 Singleton 談 constructor
從 Singleton 談 constructorLuba Tang
 
Java面试宝典
Java面试宝典Java面试宝典
Java面试宝典ma tao
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析wang hongjiang
 
不一樣的Web server... coServ
不一樣的Web server... coServ不一樣的Web server... coServ
不一樣的Web server... coServBen Lue
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)jane2006
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享zenyuhao
 

What's hot (20)

Node way
Node wayNode way
Node way
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
Java多线程设计模式
Java多线程设计模式Java多线程设计模式
Java多线程设计模式
 
Java Thread
Java ThreadJava Thread
Java Thread
 
jQuery源码学习
jQuery源码学习jQuery源码学习
jQuery源码学习
 
NHibernate分享(1) share
NHibernate分享(1) shareNHibernate分享(1) share
NHibernate分享(1) share
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)由一个简单的程序谈起――之五(精华)
由一个简单的程序谈起――之五(精华)
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
 
Object-Based Programming Part II
Object-Based Programming Part IIObject-Based Programming Part II
Object-Based Programming Part II
 
组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型组合、备忘录、建造者模式、原型
组合、备忘录、建造者模式、原型
 
從 Singleton 談 constructor
從 Singleton 談 constructor從 Singleton 談 constructor
從 Singleton 談 constructor
 
Java面试宝典
Java面试宝典Java面试宝典
Java面试宝典
 
Java script closures
Java script closuresJava script closures
Java script closures
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
 
不一樣的Web server... coServ
不一樣的Web server... coServ不一樣的Web server... coServ
不一樣的Web server... coServ
 
Jasmine2
Jasmine2Jasmine2
Jasmine2
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 

Viewers also liked

Kenya_کشور کنیا
Kenya_کشور کنیا Kenya_کشور کنیا
Kenya_کشور کنیا Mojde Ab
 
Za zapečkom, 33. del
Za zapečkom, 33. del Za zapečkom, 33. del
Za zapečkom, 33. del smuciscanet
 
Annual_Content_Strategy_Summit
Annual_Content_Strategy_SummitAnnual_Content_Strategy_Summit
Annual_Content_Strategy_SummitAlex Fryer
 
Za zapečkom, 21. del
Za zapečkom, 21. delZa zapečkom, 21. del
Za zapečkom, 21. delsmuciscanet
 
Za zapečkom, 17. del
Za zapečkom, 17. delZa zapečkom, 17. del
Za zapečkom, 17. delsmuciscanet
 
A Guide Map To Customers’ Expectations In 2016 and Beyond
A Guide Map To Customers’ Expectations In 2016 and BeyondA Guide Map To Customers’ Expectations In 2016 and Beyond
A Guide Map To Customers’ Expectations In 2016 and BeyondSocious
 
Зимний серпантин
Зимний серпантин Зимний серпантин
Зимний серпантин Library43
 

Viewers also liked (17)

Trees
TreesTrees
Trees
 
Cuadra Catedral
Cuadra CatedralCuadra Catedral
Cuadra Catedral
 
Consulta (1)
Consulta (1)Consulta (1)
Consulta (1)
 
Kenya_کشور کنیا
Kenya_کشور کنیا Kenya_کشور کنیا
Kenya_کشور کنیا
 
Clases de novelas valeria g.22-7°c
Clases de novelas  valeria g.22-7°cClases de novelas  valeria g.22-7°c
Clases de novelas valeria g.22-7°c
 
Examen unidad didáctica 9 adaptado
Examen unidad didáctica 9 adaptadoExamen unidad didáctica 9 adaptado
Examen unidad didáctica 9 adaptado
 
Za zapečkom, 33. del
Za zapečkom, 33. del Za zapečkom, 33. del
Za zapečkom, 33. del
 
Is Young
Is YoungIs Young
Is Young
 
Annual_Content_Strategy_Summit
Annual_Content_Strategy_SummitAnnual_Content_Strategy_Summit
Annual_Content_Strategy_Summit
 
Teoria examen tema 4
Teoria examen tema 4Teoria examen tema 4
Teoria examen tema 4
 
La España de Franco
La España de FrancoLa España de Franco
La España de Franco
 
Ebook ceu inferno_spugeon
Ebook ceu inferno_spugeonEbook ceu inferno_spugeon
Ebook ceu inferno_spugeon
 
Za zapečkom, 21. del
Za zapečkom, 21. delZa zapečkom, 21. del
Za zapečkom, 21. del
 
Za zapečkom, 17. del
Za zapečkom, 17. delZa zapečkom, 17. del
Za zapečkom, 17. del
 
A Guide Map To Customers’ Expectations In 2016 and Beyond
A Guide Map To Customers’ Expectations In 2016 and BeyondA Guide Map To Customers’ Expectations In 2016 and Beyond
A Guide Map To Customers’ Expectations In 2016 and Beyond
 
Зимний серпантин
Зимний серпантин Зимний серпантин
Зимний серпантин
 
Seminario 2
Seminario 2Seminario 2
Seminario 2
 

Similar to Jni攻略之八――操作对象的构造方法

Jni攻略之九――操作异常
Jni攻略之九――操作异常Jni攻略之九――操作异常
Jni攻略之九――操作异常yiditushe
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
实时任务调度
实时任务调度实时任务调度
实时任务调度Tony Deng
 
用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层yiditushe
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code cleanmacrochen
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构fangdeng
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)Yan Li
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程Bobby Zhou
 
Kissy简介
Kissy简介Kissy简介
Kissy简介jay li
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJustin Lin
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorAdy Liu
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解zany_hui
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejsChi-wen Sun
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1yiditushe
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 

Similar to Jni攻略之八――操作对象的构造方法 (20)

Jni攻略之九――操作异常
Jni攻略之九――操作异常Jni攻略之九――操作异常
Jni攻略之九――操作异常
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
实时任务调度
实时任务调度实时任务调度
实时任务调度
 
用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层
 
Sun java
Sun javaSun java
Sun java
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程
 
Kissy简介
Kissy简介Kissy简介
Kissy简介
 
Java script closures
Java script closuresJava script closures
Java script closures
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
前端测试
前端测试前端测试
前端测试
 
前端测试
前端测试前端测试
前端测试
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 

More from yiditushe

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要yiditushe
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册yiditushe
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2yiditushe
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1yiditushe
 
性能测试技术
性能测试技术性能测试技术
性能测试技术yiditushe
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术yiditushe
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试yiditushe
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训yiditushe
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程yiditushe
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Luceneyiditushe
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍yiditushe
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Actionyiditushe
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demoyiditushe
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析yiditushe
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则yiditushe
 
10 团队开发
10  团队开发10  团队开发
10 团队开发yiditushe
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模yiditushe
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模yiditushe
 
6 架构设计
6  架构设计6  架构设计
6 架构设计yiditushe
 
5 架构分析
5  架构分析5  架构分析
5 架构分析yiditushe
 

More from yiditushe (20)

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1
 
性能测试技术
性能测试技术性能测试技术
性能测试技术
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Lucene
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Action
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demo
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则
 
10 团队开发
10  团队开发10  团队开发
10 团队开发
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模
 
6 架构设计
6  架构设计6  架构设计
6 架构设计
 
5 架构分析
5  架构分析5  架构分析
5 架构分析
 

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

  • 1. 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; //ThreadTest 和 Thread 类的类 jmethodID mid , mid2 , startmid ; //ThreadTest 和 Thread 类的构造方法和 Thread 实例的开始方法 jobject obj , obj2 ; //ThreadTest 和 Thread 类的实例 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 ; } 1
  • 2. 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 中处理异常。 更多精彩请关注: http://blog.163.com/miaoxiaodong78/ 2