- 浏览: 224142 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (213)
- SQLServer (8)
- flex (8)
- 文章 (5)
- java (91)
- 数据结构 (0)
- 设计模式 (0)
- C# (2)
- Oracle (4)
- 技术 (4)
- 云计算 (0)
- 算法 (0)
- 记录 (3)
- javascript (5)
- div/css (1)
- http (0)
- IE (1)
- web (1)
- hadoop (0)
- extjs (4)
- hibernate (6)
- 错误记录 (5)
- mysql (4)
- json (1)
- jvm (1)
- spring (4)
- 工具 (2)
- tomcat (3)
- cxf (3)
- spring data (1)
- memcached (5)
- android-exception (2)
- 数据压缩 (1)
- 博客 (2)
- bat (0)
- nginx (3)
- svn (2)
- jpa (1)
- windows (2)
- h2 (2)
- webservice (2)
- android (5)
- oa (0)
- eclipse (2)
- jquery (2)
- jni (4)
- weblogic (1)
- work (0)
- smartclient (1)
- sql (0)
- excel (0)
- test (0)
- t (0)
- js (4)
- utils (0)
- bootstrap (0)
- sniper (0)
- ztree (0)
- google (0)
- mdb (0)
- redis (1)
- 思想 (1)
- css (0)
- appCan (0)
- activiti (0)
- 工作 (0)
- 浏览器 (1)
http://www.iteye.com/topic/67567
最近在项目中要监控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
jni_StuService.h 代码
最近在项目中要监控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
jni_StuService.h 代码
- jni_demo.rar (49.9 KB)
- 下载次数: 0
- native.rar (12.9 KB)
- 下载次数: 0
相关推荐
本主题聚焦于“Java调用C++动态库”,这是一个关键的技术,它允许Java应用程序利用C++编写的高效库,比如图形处理、硬件驱动或者算法实现等。这种技术主要依赖于Java Native Interface (JNI),它是Java平台标准的一...
总结来说,Java调用C++动态库是一个涉及多步骤的过程,包括生成JNI头文件、编写C++代码、编译动态库、加载库并在Java中调用本地方法。这个过程中需要考虑线程安全、数据类型转换以及异常处理等问题,以确保程序的...
本教程将详细介绍如何在Java中调用C++动态库,并通过提供的`NativeDemo+java代码`进行实践。 首先,了解JNI。JNI是Java平台的标准接口,允许Java代码和其他语言写的代码进行交互。它提供了一种方式,使得Java程序员...
Java 使用 JNI 接口调用 C++ 动态库 Java 通过使用 JNI(Java Native Interface)接口可以调用 C++ 动态库,该技术可以大大扩展 Java 的能力,让 Java 应用程序可以与其他语言编写的程序进行交互。下面是 Java 使用...
本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...
本案例将详细介绍如何使用JNA来调用C++动态库,特别是处理二维数组的输入和输出。 首先,我们需要了解JNA的基本原理。JNA通过映射Java接口到本地函数,实现了跨语言调用。它提供了一个简洁的方式来定义C/C++函数...
Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库...总的来说,通过JNA,Java开发者可以轻松地利用已有的C/C++动态库资源,扩展Java应用的功能,而无需深入学习JNI。这使得Java开发更加灵活且高效。
### Linux 下 Java 开发环境搭建及 C++ 动态库加载方法详解 #### 一、Linux 下 Java 开发背景 Java 作为一种广泛使用的编程语言,其设计初衷是实现一次编写,到处运行的目标,即跨平台特性。这使得 Java 程序能够...
总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...
适用人群:想通过jna的方式...资源内容:java通过jna方式调用C++动态链接库,多种传参实际案例。具体包括基础数据类型、指针类型、结构类型、结构指针类型,里面带有例子dll,可直接运行。 注意事项:需要用32位的jdk
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
3. 调用C++动态链接库的两种方式: - **JNI(Java Native Interface)**:JNI是一种直接在Java代码中嵌入C/C++代码的方式。首先,你需要在Java类中声明`native`关键字修饰的方法,然后使用`javah`工具生成C/C++...
**Java调用C++动态库** 则需要使用Java Native Interface(JNI)。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。开发者需要编写C/C++的本地方法,这些方法会被Java代码通过JNI调用。 ...
标题“java调用c++生成so库”指的是在Linux环境下,通过JNI技术,Java程序可以调用预先用C++编译生成的动态链接库(.so文件)。.so文件是Linux下的动态共享对象,相当于Windows下的.DLL文件,它包含了可由多个程序...
这个项目"myEclipse java调用c++动态链接库实现人脸识别所有工程"正是这种需求的一个实例,它利用了Java的JNI(Java Native Interface)技术来调用C++编译的动态链接库(DLL),从而实现人脸识别功能。以下将详细...
JNI调用C++动态库: JNI是Java平台官方支持的本地接口,允许Java代码直接调用C/C++函数。以下是一些关键知识点: 1. **JNI头文件**:在JNI编程中,我们需要一个头文件,由`javah`工具自动生成,它定义了Java类中的...
**C++动态库**: 在C++中,动态链接库(DLL)通常表示为.so文件,它们在运行时被加载到进程内存中。在Ubuntu上,你需要使用Qt Creator或者g++命令行来编译你的C++代码为动态库。确保在编译时指定`-fPIC`选项以生成...