JNI 对象的操作

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

1.编写java程序,
1.1

java 代码(Student.java)

 

/**
*
*/
package jni;
/**
* @author likun
*
*/
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;
/**
* @author likun
*
*/
public class StuService {
static {
System.loadLibrary("student");
}
/**
* 获得Student's List
* @return
*/
public static native List getStuList();
/**
* 返回Student对象
* 非静态方法
* @return
*/
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)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class jni_StuService */
#ifndef _Included_jni_StuService
#define _Included_jni_StuService
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_StuService
* Method: getStuList
* Signature: ()Ljava/util/List;
*/
JNIEXPORT jobject JNICALL Java_jni_StuService_getStuList
(JNIEnv *, jclass);
/*
* Class: jni_StuService
* Method: getStudent
* Signature: ()Ljni/Student;
*/
JNIEXPORT jobject JNICALL Java_jni_StuService_getStudent
(JNIEnv *, jobject);
/*
* 构造Student对象
* Method: constructStudent
* Signature: ()Ljni/Student;
*/
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"
/*
* Class: jni_StuService
* Method: getStuList
* Signature: ()Ljava/util/List;
*/
jobject JNICALL Java_jni_StuService_getStuList
(JNIEnv *env, jclass)
{
/**************创建ArrayList 对象 start*****************/
jclass class_ArrayList=env->FindClass("java/util/ArrayList");/* 获得Java类 */
jmethodID construct=env->GetMethodID( class_ArrayList, "<init></init>","()V");/* 获得构造方法 */
jobject obj_List =env->NewObject( class_ArrayList, construct, "");/* 创建java对象 */
/**************创建ArrayList 对象 end *****************/
/* 获得List的add方法 */
jmethodID list_add=env->GetMethodID(class_ArrayList,"add","(Ljava/lang/Object;)Z");
int i=0;
while(i<3){
jobject student=constructStudent(env,i);
/* 调用List 的add方法 */
env->CallObjectMethod(obj_List,list_add,student);
++i;
}
return obj_List;
}
/*
* Class: jni_StuService
* Method: getStudent
* Signature: ()Ljni/Student;
*/
JNIEXPORT jobject JNICALL Java_jni_StuService_getStudent
(JNIEnv *env, jobject obj_this)
{
return constructStudent(env,15);
}
/*
* 构造Student对象
* Method: constructStudent
* Signature: ()Ljni/Student;
*/
jobject constructStudent(JNIEnv *env,int i ){
/**************创建Student 对象 start*****************/
jclass class_Student=env->FindClass("jni/Student");/* 获得Java类 */
jmethodID construct_Student=env->GetMethodID( class_Student, "<init></init>","()V");/* 获得构造方法 */
jobject obj_Student =env->NewObject( class_Student, construct_Student, "");/* 创建java对象 */
/**************创建Student 对象 end *****************/
/**************创建属性ID***************************/
jfieldID name = env->GetFieldID(class_Student,"name","Ljava/lang/String;");
jfieldID age = env->GetFieldID(class_Student,"age","I");
/**************创建属性ID end***************************/
/**************给对象的属性赋值*************************/
env->SetIntField(obj_Student,age,27+i);
env->SetObjectField(obj_Student,name,env->NewStringUTF((char*)"likun35@163.com"));
/**************给对象的属性赋值end *************************/
return obj_Student;
}

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

5.运行StuService

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JNI(Java Native Interface)是Java平台的一个组成部分,它允许Java代码与其他语言写的代码进行交互。当Java应用程序需要调用本地代码(如C或C++)时,就会使用JNI。 在JNI中,操作`BufferedImage`对象主要涉及到以下几个步骤: 1. **创建本地方法声明**:首先,你需要声明一个本地方法,该方法接受一个`BufferedImage`对象作为参数。这个方法通常用于加载图像或进行图像处理。 ```java public native void processImage(BufferedImage image); ``` 2. **生成JNI头文件**:使用`javah`工具从你的Java类生成JNI头文件。这个工具会生成一个包含本地方法声明的头文件。 ```bash javah -jni com.yourpackage.YourClass ``` 3. **实现本地方法**:使用C或C++实现这个本地方法。在这个方法中,你可以访问`BufferedImage`对象并进行处理。需要注意的是,在JNI中,所有的数据都是通过指针传递的,所以你需要正确地管理这些指针。 ```c JNIEXPORT void JNICALL Java_com_yourpackage_YourClass_processImage(JNIEnv *env, jobject obj, jobject image) { // 获取BufferedImage对象的指针 jobject realImage = (*env)->GetObjectField(env, image, (jfieldID) 0); BufferedImage *bufferedImage = (BufferedImage *) (*env)->GetIntField(env, realImage, (jfieldID) 0); // 在这里你可以对bufferedImage进行操作... } ``` 4. **编译并链接你的本地代码**:使用你的构建工具(如gcc或g++)编译你的本地代码,并链接到你的Java应用程序。 5. **在Java代码中调用本地方法**:最后,你可以在Java代码中调用这个本地方法,并传递一个`BufferedImage`对象作为参数。 请注意,JNI操作通常需要一些底层知识,包括内存管理、指针操作等。同时,你也需要注意Java的安全模型,以确保你的代码不会对系统造成危害。如果你不熟悉这些概念,我建议你寻求一些更详细的教程或资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值