最近在项目中要监控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
- 浏览 4675
- 评论(1)
- 论坛回复 / 浏览 (1 / 8957)
- 查看更多
相关推荐
在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层服务或者调用已有的C库。本示例主要探讨如何在JNI中创建并返回一个对象数组到Java层。 首先,我们需要...
1. 错误处理:JNI操作可能会抛出异常,如找不到类或方法,需要进行适当的错误处理。 2. 内存管理:由于C++和Java的内存管理机制不同,需要谨慎处理字符串和对象的生命周期,避免内存泄漏。 3. 类型转换:在JNI中,...
在这个主题中,我们将深入探讨如何在JNI中操作ArrayList对象并添加一个int类型的数据。 首先,我们需要理解ArrayList在Java中的本质。ArrayList是Java集合框架中的一个重要类,它实现了List接口,用于存储可变大小...
在这个场景中,我们将探讨如何使用JNI在C/C++层操作Java的List集合,特别是存储Java对象。 首先,我们需要理解在JNI中如何与Java对象进行交互。Java对象在JNI中通常表示为`jobject`,而List集合则是一个特定类型的...
`JNI对象的操作.txt`可能会涵盖更多基本对象的创建和访问,而`JNI字符串处理.txt`将详细讲解String对象的各种操作。`jni数据处理.txt`可能涉及不同类型的数据转换,如整型、浮点型和数组的处理。 总的来说,JNI提供...
本主题主要关注如何通过JNI从C++代码中获取并操作Java对象。 1. **JNI基础** JNI是Java平台标准的一部分,为开发者提供了在本地代码(如C或C++)中调用Java方法和字段,以及创建和操作Java对象的能力。JNI接口包括...
在本场景中,"JNI创建java对象"指的是利用JNI技术在C/C++原生代码中创建和操作Java对象。JNI在Android开发中尤其重要,因为Android系统的主要编程语言是Java,但为了实现高性能计算或调用操作系统底层功能,开发者...
总结来说,通过JNI将Java对象传递到C代码,需要理解JNI的API,正确处理Java对象的生命周期,并确保在C代码中安全地操作这些对象。这既是一个挑战,也是提升程序性能和功能的重要手段。在实际开发中,应充分考虑跨...
本示例"android jni 传递对象的demo"聚焦于一个特定的应用场景:在Java层和C/C++层之间传递对象。 首先,我们要理解在Java和C/C++之间传递对象的挑战。Java对象在JVM(Java虚拟机)中以引用的形式存在,而C/C++则不...
对于引用类型数组,如String[],可以使用`GetObjectArrayElement()`获取数组元素,再调用上面提到的对象操作方法。 4. **使用Java监听器:** 要在C/C++中触发Java事件,可以定义一个回调接口,如`OnClickListener`...
本篇文章将深入探讨JNI中参数传递的基本数据类型、自定义对象以及系统对象。 一、基本数据类型的参数传递 在JNI中,基本数据类型如int、float、char等的传递相对简单。Java中的基本类型在C/C++中都有对应的类型。...
本篇文章将深入探讨在Android Studio中使用JNI的函数以及如何传递复杂对象。 首先,JNI的核心是通过`JNIEnv`指针来访问Java对象和方法。`JNIEnv`是一个结构体指针,包含了调用Java方法、创建Java对象等一系列接口。...
在实际开发中,还需要注意一些细节,比如错误处理、内存管理(Java对象在本地代码中使用需要通过JNI函数创建和释放)、线程安全问题等。同时,由于涉及到跨语言和跨平台,理解JNI的工作原理和正确使用JNI头文件至关...
描述中提到的"包含文件 jni.pas JNI_MD.INC",`JNI_MD.INC`是一个平台特定的包含文件,可能包含了与特定操作系统相关的定义,例如指针大小、数据对齐等。这个文件对于确保在不同平台上正确编译和链接JNI代码至关重要...
### JNI攻略之八——操作对象的构造方法:深入解析与实践 #### 一、引言 Java Native Interface(JNI)是Java平台的一部分,它允许Java代码与其他语言编写的代码进行交互,尤其是C和C++。JNI提供了一种机制,使得...
JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的。 基础数据类型数组 基本数据类型数组对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基本...
在本示例中,我们关注的是如何在JNI中使用`jobjectArray`来处理Java对象数组。 `jobjectArray`是JNI中的一个类型,它代表了Java世界中的对象数组。使用`jobjectArray`,我们可以从本地代码创建、访问和修改Java对象...
这段C++代码中,我们使用了JNI的API来处理Java对象和字符串。`JNIEnv *env`参数提供了与Java环境交互的接口,`jstring`是Java字符串的本地表示。`GetStringUTFChars`用于获取Java字符串的UTF-8编码,`NewStringUTF`...
此外,`JNIEnv`指针是JNI的核心,它包含了所有上述的函数指针,通过这个指针,本地代码可以访问并操作Java对象。 `jni_md.h`则是一个平台相关的头文件,它根据不同的操作系统和处理器架构提供具体的实现细节。例如...
2. **JNI函数声明**:提供了大量的函数声明,用于操作Java对象、类、方法、字段等,如`FindClass`, `GetMethodID`, `CallVoidMethod`等。这些函数允许开发者在本地代码中查找并调用Java方法。 3. **JNI常量**:定义...