最近在项目中要监控DLL动态库的操作,在网上搜了半天,很少有关于JNI对象操作的资料,所以写了一个Demo方便大家以后搜索!
1.编写java程序,
1.1
java 代码(Student.java)
-
-
-
- package jni;
-
-
-
-
-
- public class Student {
- String name;
- int age;
- public Student(){
-
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String toString(){
- System.out.println("Name:"+name+" Age:"+age);
- return "Name:"+name+" Age:"+age;
- }
- }
java 代码(StuService.java)
-
-
-
- package jni;
-
- import java.util.Iterator;
- import java.util.List;
-
-
-
-
-
- public class StuService {
-
- static {
- System.loadLibrary("student");
- }
-
-
-
-
-
- public static native List getStuList();
-
-
-
-
-
-
- public native Student getStudent();
-
-
- public static void main(String[] args) {
- StuService stuService=new StuService();
- stuService.getStudent().toString();
-
- List list=StuService.getStuList();
- for(Iterator ite=list.iterator();ite.hasNext();)
- {
- Student stu=(Student)ite.next();
- stu.toString();
- }
-
-
- }
-
- }
声明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)
-
- #include "jni.h"
-
-
- #ifndef _Included_jni_StuService
- #define _Included_jni_StuService
- #ifdef __cplusplus
- extern "C" {
- #endif
-
-
-
-
-
- JNIEXPORT jobject JNICALL Java_jni_StuService_getStuList
- (JNIEnv *, jclass);
-
-
-
-
-
-
- JNIEXPORT jobject JNICALL Java_jni_StuService_getStudent
- (JNIEnv *, jobject);
-
-
-
-
-
-
- jobject constructStudent(JNIEnv *env ,int i);
-
- #ifdef __cplusplus
- }
- #endif
- #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)
- #include "jni_StuService.h"
-
-
-
-
-
- jobject JNICALL Java_jni_StuService_getStuList
- (JNIEnv *env, jclass)
- {
-
-
- jclass class_ArrayList=env->FindClass("java/util/ArrayList");
-
- jmethodID construct=env->GetMethodID( class_ArrayList, "<init></init>","()V");
-
- jobject obj_List =env->NewObject( class_ArrayList, construct, "");
-
-
-
-
-
- jmethodID list_add=env->GetMethodID(class_ArrayList,"add","(Ljava/lang/Object;)Z");
-
- int i=0;
- while(i<3){
-
- jobject student=constructStudent(env,i);
-
-
- env->CallObjectMethod(obj_List,list_add,student);
-
- ++i;
- }
-
-
- return obj_List;
-
-
- }
-
-
-
-
-
-
-
- JNIEXPORT jobject JNICALL Java_jni_StuService_getStudent
- (JNIEnv *env, jobject obj_this)
- {
- return constructStudent(env,15);
- }
-
-
-
-
-
- jobject constructStudent(JNIEnv *env,int i ){
-
-
-
- jclass class_Student=env->FindClass("jni/Student");
-
- jmethodID construct_Student=env->GetMethodID( class_Student, "<init></init>","()V");
-
- jobject obj_Student =env->NewObject( class_Student, construct_Student, "");
-
-
-
-
-
-
- jfieldID name = env->GetFieldID(class_Student,"name","Ljava/lang/String;");
-
- jfieldID age = env->GetFieldID(class_Student,"age","I");
-
-
-
-
-
-
- env->SetIntField(obj_Student,age,27+i);
-
- env->SetObjectField(obj_Student,name,env->NewStringUTF((char*)"likun35@163.com"));
-
-
-
- return obj_Student;
- }
4. 将生成的student.dll拷贝到\WINDOWS%root%\system32下面
5.运行StuService
jni_StuService.h 代码
分享到:
- 2007-04-03 11:28
- 浏览 4626
- 评论(1)
- 论坛回复 / 浏览 (1 / 8936)
- 查看更多
相关推荐
在jni中操作arraylist对象,然后添加一个int型数据进去
这是我用于测试,主要用于jni创建java对象病操作
JNI处理hashmap,string等对象的操作,别处绝对没有的
这是一个android 使用jni来实现list集合存储java对象
JNI攻略之八――操作对象的构造方法
JVM封装了各种操作系统实际的差异性的同时,提供了JNI技术,使得开发者可以通过JAVA程序调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能,同时其他技术和系统也可以...
JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的。 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基本数据类型的使用...
Native层与Java间类的传递,实现向Native层传递一个类,并从Native层返回一个类。轻松掌握JNI类的操作
内含JNI++ User Guide.pdf,java调用c++/c操作,可实现基本类型,数组传递,对象调用等功能
环境:Windows XP Professional、JDK 1.6、标准C库 说明:作为Java程序员,当与c程序员进行联合开发时会使用到JNI编程技术。此时要求Java程序员必须要会使用...学习对象:需要在Windows环境下进行JNI开发的Java程序员。
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 ...
COM对象的调用,完成在Java中对Excel的操作;同时将Excel的各COM 对象映射为Java对象, 调用自行设计开发的一组纯Java API,实现在Java中的复杂报表功能.首先描述了该方案提出的 方法和功能,然后给出了系统构架,...
JNI攻略之八――操作对象的构造方法.pdf JNI攻略之十――操作Java虚拟机.pdf JNI攻略之十一――启动虚拟机调用java类.pdf 从大学教育与工作的差距谈源代码阅读的必要.pdf 六步教你学会简单RMI.pdf 我是谁.pdf 教你...
JNI攻略之八――操作对象的构造方法.pdf JNI攻略之九――操作异常.pdf JNI攻略之十――操作Java虚拟机.pdf JNI攻略之十一――启动虚拟机调用java类.pdf JNI攻略之一――建立一个简单的JNI程序.pdf
如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象...
HotSpot的垃圾回收机制采用分代回收,堆分为年轻代和老年代,非堆就是持久带。面对不同的代,采用不同的回收策略。 而年轻代又可以分为1个Eden和2个...JNI调用本地库,本地代码所消耗的内存需要操作系统额外开辟内存。
4、Oracle Olap API虽与JOlap不兼容,但是两者的概念非常类似,他们与其他API最大的不同之 <br>处是非常强调元数据与数据的区别,这一点从两者的文档中可以直观的看到:直接的对象体系及操作是 <br>没有...
8.5 操作jni文件 8.6 获取文件的日期信息 8.7 检测软盘或光碟是否有过变化 8.8 检测驱动器容量 8.9 复制整个目录 8.10 将文件删除到回收站中 8.11 检测驱动器是否就绪 8.12 操作临时文件 第9章 打印的实现 9.1 用...
相信有些Android&图像算法开发者和我一样,遇到过这样的状况:要对Bitmap对象做一些密集计算(例如逐像素的滤波),但是在java层写循环代码来逐像素操作明显是不现实的,因为Java代码的运行速度太慢,而一副很小的...
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程序设计与性能...