`
fireflyjava
  • 浏览: 184437 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JNI 对象的操作

    博客分类:
  • Java
阅读更多

最近在项目中要监控DLL动态库的操作,在网上搜了半天,很少有关于JNI对象操作的资料,所以写了一个Demo方便大家以后搜索!

1.编写java程序,
1.1 

java 代码(Student.java)

 

  1. /**  
  2.  *   
  3.  */  
  4. package jni;   
  5.   
  6. /**  
  7.  * @author likun  
  8.  *  
  9.  */  
  10. public class Student {   
  11.     String name;   
  12.     int age;   
  13.     public Student(){   
  14.            
  15.     }   
  16.     public int getAge() {   
  17.         return age;   
  18.     }   
  19.     public void setAge(int age) {   
  20.         this.age = age;   
  21.     }   
  22.     public String getName() {   
  23.         return name;   
  24.     }   
  25.     public void setName(String name) {   
  26.         this.name = name;   
  27.     }   
  28.     public String toString(){   
  29.         System.out.println("Name:"+name+"  Age:"+age);   
  30.         return "Name:"+name+"  Age:"+age;   
  31.     }   
  32. }   

 

java 代码(StuService.java)
  1. /**  
  2.  *   
  3.  */  
  4. package jni;   
  5.   
  6. import java.util.Iterator;   
  7. import java.util.List;   
  8.   
  9. /**  
  10.  * @author likun  
  11.  *  
  12.  */  
  13. public class StuService {   
  14.        
  15.     static {   
  16.         System.loadLibrary("student");   
  17.     }   
  18.        
  19.     /**  
  20.      * 获得Student's List  
  21.      * @return  
  22.      */  
  23.     public static native List getStuList();    
  24.        
  25.     /**  
  26.      * 返回Student对象  
  27.      * 非静态方法  
  28.      * @return  
  29.      */  
  30.     public  native Student getStudent();       
  31.        
  32.        
  33.     public static void main(String[] args) {   
  34.         StuService stuService=new StuService();   
  35.         stuService.getStudent().toString();   
  36.            
  37.         List list=StuService.getStuList();   
  38.         for(Iterator ite=list.iterator();ite.hasNext();)   
  39.         {   
  40.             Student stu=(Student)ite.next();   
  41.             stu.toString();   
  42.         }   
  43.            
  44.            
  45.     }   
  46.   
  47. }   


声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。
Load动态库:System.loadLibrary("student");

1.2 编译StuService.java
javac -classpath . -d . jni/StuService.java

2.生成jni_StuService.h头文件
javah -classpath . -d . jni.StuService

cpp 代码(jni_StuService.h)
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include "jni.h"   
  3. /* Header for class jni_StuService */  
  4.   
  5. #ifndef _Included_jni_StuService   
  6. #define _Included_jni_StuService   
  7. #ifdef __cplusplus   
  8. extern "C" {   
  9. #endif   
  10. /*  
  11.  * Class:     jni_StuService  
  12.  * Method:    getStuList  
  13.  * Signature: ()Ljava/util/List;  
  14.  */  
  15. JNIEXPORT jobject JNICALL Java_jni_StuService_getStuList   
  16.   (JNIEnv *, jclass);   
  17.   
  18. /*  
  19.  * Class:     jni_StuService  
  20.  * Method:    getStudent  
  21.  * Signature: ()Ljni/Student;  
  22.  */  
  23. JNIEXPORT jobject JNICALL Java_jni_StuService_getStudent   
  24.   (JNIEnv *, jobject);   
  25.   
  26. /*  
  27.  * 构造Student对象  
  28.  * Method:    constructStudent  
  29.  * Signature: ()Ljni/Student;  
  30.  */  
  31. jobject constructStudent(JNIEnv *env ,int i);   
  32.   
  33. #ifdef __cplusplus   
  34. }   
  35. #endif   
  36. #endif   

3.在VC++环境中创建一个动态链接库的项目
3.1 File->new->Projects->Win32 Dynamic-Link Library
3.2 将jni_StuService.h加入Header Files
3.3 %root%\j2sdk1.4.2_10\include\jni.h 和%root%\j2sdk1.4.2_10\include\win32\jni_md.h加入Header Files
3.4 创建student.cpp,并实现 jni_StuService.h中的Java_jni_StuService_getStudent和Java_jni_StuService_getStuList的方法.

cpp 代码(student.cpp)
  1. #include "jni_StuService.h"    
  2. /*  
  3.  * Class:     jni_StuService  
  4.  * Method:    getStuList  
  5.  * Signature: ()Ljava/util/List;  
  6.  */  
  7.  jobject JNICALL Java_jni_StuService_getStuList   
  8.      (JNIEnv *env, jclass)   
  9.  {   
  10.     /**************创建ArrayList 对象 start*****************/  
  11.   
  12.     jclass class_ArrayList=env->FindClass("java/util/ArrayList");/* 获得Java类 */  
  13.   
  14.     jmethodID construct=env->GetMethodID( class_ArrayList, "<init></init>","()V");/* 获得构造方法 */  
  15.        
  16.     jobject obj_List =env->NewObject( class_ArrayList, construct, "");/* 创建java对象 */  
  17.   
  18.   
  19.     /**************创建ArrayList 对象 end *****************/  
  20.   
  21.     /* 获得List的add方法 */  
  22.     jmethodID list_add=env->GetMethodID(class_ArrayList,"add","(Ljava/lang/Object;)Z");   
  23.   
  24.     int i=0;   
  25.     while(i<3){   
  26.   
  27.         jobject student=constructStudent(env,i);   
  28.   
  29.         /* 调用List 的add方法 */  
  30.         env->CallObjectMethod(obj_List,list_add,student);   
  31.   
  32.         ++i;   
  33.     }   
  34.   
  35.        
  36.     return obj_List;   
  37.   
  38.   
  39.  }   
  40.   
  41.   
  42. /*  
  43.  * Class:     jni_StuService  
  44.  * Method:    getStudent  
  45.  * Signature: ()Ljni/Student;  
  46.  */  
  47. JNIEXPORT jobject JNICALL Java_jni_StuService_getStudent   
  48.   (JNIEnv *env, jobject obj_this)   
  49. {   
  50.     return constructStudent(env,15);   
  51. }   
  52. /*  
  53.  * 构造Student对象  
  54.  * Method:    constructStudent  
  55.  * Signature: ()Ljni/Student;  
  56.  */  
  57. jobject constructStudent(JNIEnv *env,int i ){   
  58.        
  59.     /**************创建Student 对象 start*****************/  
  60.   
  61.     jclass class_Student=env->FindClass("jni/Student");/* 获得Java类   */  
  62.   
  63.     jmethodID construct_Student=env->GetMethodID( class_Student, "<init></init>","()V");/* 获得构造方法 */  
  64.        
  65.     jobject obj_Student =env->NewObject( class_Student, construct_Student, "");/* 创建java对象 */  
  66.   
  67.     /**************创建Student 对象 end *****************/  
  68.   
  69.   
  70.     /**************创建属性ID***************************/  
  71.   
  72.     jfieldID name = env->GetFieldID(class_Student,"name","Ljava/lang/String;");   
  73.   
  74.     jfieldID age = env->GetFieldID(class_Student,"age","I");   
  75.   
  76.     /**************创建属性ID end***************************/  
  77.   
  78.   
  79.     /**************给对象的属性赋值*************************/          
  80.        
  81.     env->SetIntField(obj_Student,age,27+i);   
  82.        
  83.     env->SetObjectField(obj_Student,name,env->NewStringUTF((char*)"likun35@163.com"));   
  84.   
  85.     /**************给对象的属性赋值end *************************/  
  86.   
  87.     return obj_Student;   
  88. }  

4. 将生成的student.dll拷贝到\WINDOWS%root%\system32下面

5.运行StuService

 

jni_StuService.h 代码
  • jni_demo.rar (49.9 KB)
  • 描述: JNI对象操作例子
  • 下载次数: 523
分享到:
评论
1 楼 jackey3316 2007-04-03  
辛苦
最近也研究了一下jni  项目中需要~~

网上例子还是挺多的~~

相关推荐

    jni操作arraylist对象

    在jni中操作arraylist对象,然后添加一个int型数据进去

    JNI创建java对象

    这是我用于测试,主要用于jni创建java对象病操作

    JNI处理hashmap,string等对象的操作

    JNI处理hashmap,string等对象的操作,别处绝对没有的

    jni操作list集合,来存储对象

    这是一个android 使用jni来实现list集合存储java对象

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

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

    android_JNI介绍

    JVM封装了各种操作系统实际的差异性的同时,提供了JNI技术,使得开发者可以通过JAVA程序调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能,同时其他技术和系统也可以...

    Android中的JNI数组操作教程

    JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的。 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基本数据类型的使用...

    JNI实战一:向Native层传递一个类,并从Native层返回一个类

    Native层与Java间类的传递,实现向Native层传递一个类,并从Native层返回一个类。轻松掌握JNI类的操作

    JNI++ 用户手册(英文),JNI++ User Guide

    内含JNI++ User Guide.pdf,java调用c++/c操作,可实现基本类型,数组传递,对象调用等功能

    关于Java的JNI开发时使用cl编译器的说明

    环境:Windows XP Professional、JDK 1.6、标准C库 说明:作为Java程序员,当与c程序员进行联合开发时会使用到JNI编程技术。此时要求Java程序员必须要会使用...学习对象:需要在Windows环境下进行JNI开发的Java程序员。

    《深入理解Android》卷Ⅰ

    2.4.4 通过JNIEnv操作jobject 2.4.5 jstring介绍 2.4.6 JNI类型签名介绍 2.4.7 垃圾回收 2.4.8 JNI中的异常处理 2.5 本章小结 第3章 深入理解init 3.1 概述 3.2 init分析 3.2.1 解析配置文件 3.2.2 解析service ...

    Java中Excel操作类的设计与实现

    COM对象的调用,完成在Java中对Excel的操作;同时将Excel的各COM 对象映射为Java对象, 调用自行设计开发的一组纯Java API,实现在Java中的复杂报表功能.首先描述了该方案提出的 方法和功能,然后给出了系统构架,...

    java高手的文章合集 pdf格式

    JNI攻略之八――操作对象的构造方法.pdf JNI攻略之十――操作Java虚拟机.pdf JNI攻略之十一――启动虚拟机调用java类.pdf 从大学教育与工作的差距谈源代码阅读的必要.pdf 六步教你学会简单RMI.pdf 我是谁.pdf 教你...

    java高手的文章合集2/3

    JNI攻略之八――操作对象的构造方法.pdf JNI攻略之九――操作异常.pdf JNI攻略之十――操作Java虚拟机.pdf JNI攻略之十一――启动虚拟机调用java类.pdf JNI攻略之一――建立一个简单的JNI程序.pdf

    jdbc连接数据库的方式2

    如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象...

    关于JVM内存回收算法的补充

    HotSpot的垃圾回收机制采用分代回收,堆分为年轻代和老年代,非堆就是持久带。面对不同的代,采用不同的回收策略。 而年轻代又可以分为1个Eden和2个...JNI调用本地库,本地代码所消耗的内存需要操作系统额外开辟内存。

    Oracle Olap开发备忘录

    4、Oracle Olap API虽与JOlap不兼容,但是两者的概念非常类似,他们与其他API最大的不同之 &lt;br&gt;处是非常强调元数据与数据的区别,这一点从两者的文档中可以直观的看到:直接的对象体系及操作是 &lt;br&gt;没有...

    C++Builder 6.0设计师之路 pdf版

    8.5 操作jni文件 8.6 获取文件的日期信息 8.7 检测软盘或光碟是否有过变化 8.8 检测驱动器容量 8.9 复制整个目录 8.10 将文件删除到回收站中 8.11 检测驱动器是否就绪 8.12 操作临时文件 第9章 打印的实现 9.1 用...

    Android中利用C++处理Bitmap对象的实现方法

    相信有些Android&图像算法开发者和我一样,遇到过这样的状况:要对Bitmap对象做一些密集计算(例如逐像素的滤波),但是在java层写循环代码来逐像素操作明显是不现实的,因为Java代码的运行速度太慢,而一副很小的...

    Java优化编程(第2版)

    4.3.3 通过自定制缓冲区提高i/o操作效率 4.3.4 通过压缩流提高i/o操作效率 4.3.5 通过非阻塞i/o优化应用性能 4.4 其他 104 4.4.1 数据格式化与性能优化 4.4.2 获取文件信息与性能优化 小结 第5章 jni程序设计与性能...

Global site tag (gtag.js) - Google Analytics