用JNI调用C或C++动态联接库入门
来源:互联网 发布:装修预算软件下载 编辑:程序博客网 时间:2024/06/04 17:55
使用Java的JNI调用C/C++的动态联结库有个固定的步骤,下面将以一个最简单的HelloWorld例子程序来说明调用过程。这个HelloWorld的例子只是简单的显示HelloWorld消息。
第一步 编写Java类
首先,我们创建一个名为jnitest的Eclipse工程,并新建一个src源代码目录。
这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLL。HelloWorld类包含一个本地方法displayHelloWorld(),TestDLL用于测试这个本地方法。HelloWorld的源码清单如下:
List1. HelloWorld.java源码
public class HelloWorld {
public native void displayHelloWorld();①
static{
System.loadLibrary("HelloWorld"; ②
}
}
TestDLL源码如下:
List2. TestDLL.java源码
public class TestDLL {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayHelloWorld();
}
}
说明:①是java本地方法申明;②装入动态链接库,"HelloWorld"是要装入的动态链接库名称。
第二步 编译Java类
在Eclipse工具中编译Java类。编译后的class文件会自动放入工程目录下的bin目录中。
第三步 生成C/C++头文件
在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:
List3. HelloWorld.h源码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
注意,不要修改这个头文件。
第四步 编写本地方法实现
用VC6创建HelloWorld Win32动态链接库工程。将上述生成的头文件HelloWorld.h拷贝到
D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目录下面。
将D:\j2sdk1.4.2\include目录下的jni.h和D:\j2sdk1.4.2\include\win32\jni_md.h两个头文件拷贝到VC安装目录下的D:\Program Files\Microsoft Visual Studio\VC98\Include目录下面。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译生成DLL。
List4. HelloWorld.cpp源码
#include "HelloWorld.h"
#include <stdio.h>
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject)
{
printf("Hello World!\n";
return;
}
第五部 运行测试程序
先将生成的DLL拷贝到jnitest工程的D:\workspace\jnitest\bin下面,然后设置DLL搜索路径(环境变量PATH)为D:\workspace\jnitest\bin(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可)③。重新启动Elipse后,运行测试程序,将看到控制台输出“Hello World!”
注意,③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面。这里,我折腾了不少时间,才搞定。
第一步 编写Java类
首先,我们创建一个名为jnitest的Eclipse工程,并新建一个src源代码目录。
这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLL。HelloWorld类包含一个本地方法displayHelloWorld(),TestDLL用于测试这个本地方法。HelloWorld的源码清单如下:
List1. HelloWorld.java源码
public class HelloWorld {
public native void displayHelloWorld();①
static{
System.loadLibrary("HelloWorld"; ②
}
}
TestDLL源码如下:
List2. TestDLL.java源码
public class TestDLL {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayHelloWorld();
}
}
说明:①是java本地方法申明;②装入动态链接库,"HelloWorld"是要装入的动态链接库名称。
第二步 编译Java类
在Eclipse工具中编译Java类。编译后的class文件会自动放入工程目录下的bin目录中。
第三步 生成C/C++头文件
在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:
List3. HelloWorld.h源码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
注意,不要修改这个头文件。
第四步 编写本地方法实现
用VC6创建HelloWorld Win32动态链接库工程。将上述生成的头文件HelloWorld.h拷贝到
D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目录下面。
将D:\j2sdk1.4.2\include目录下的jni.h和D:\j2sdk1.4.2\include\win32\jni_md.h两个头文件拷贝到VC安装目录下的D:\Program Files\Microsoft Visual Studio\VC98\Include目录下面。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译生成DLL。
List4. HelloWorld.cpp源码
#include "HelloWorld.h"
#include <stdio.h>
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject)
{
printf("Hello World!\n";
return;
}
第五部 运行测试程序
先将生成的DLL拷贝到jnitest工程的D:\workspace\jnitest\bin下面,然后设置DLL搜索路径(环境变量PATH)为D:\workspace\jnitest\bin(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可)③。重新启动Elipse后,运行测试程序,将看到控制台输出“Hello World!”
注意,③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面。这里,我折腾了不少时间,才搞定。
- 用JNI调用C或C++动态联接库入门
- java如何调用dll:用JNI调用C或C++动态联接库原来如此简单
- 用JNI调用C或C++动态联接库原来如此简单
- 用JNI调用C或C++动态联接库原来如此简单
- 用JNI调用C或C++动态联接库原来如此简单
- java JNI 调用c或c++,windows 或 Linux系统
- JAVA使用JNI调用C/C++动态库
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库
- Java调用C/C++编写的动态连接库-JNI
- linux下 java JNI调用C语言动态链接库
- java 调用C/C++ JNI 动态链接库
- JAVA使用JNI调用C/C++动态库
- java(JNI)调用c/c++动态链接库 linux
- java借助于JNI调用c/c++动态链接库
- Java调用C++: JNI的使用入门
- android jni调用c库
- Android利用JNI实现java调用C或C++
- OCP-1Z0-052-V8.02-46题
- Spring中@Inject 如何通过构造器注入Provider
- Myeclipse 便捷输出 syso
- SQL优化
- ORACLE设置当前日期格式
- 用JNI调用C或C++动态联接库入门
- js限制输入框字数
- leetcode:Partition List (链表处理)【面试算法题】
- 如何训练自己
- Android 中Java 和C/C++的相互调用方法
- Apache支持htaccess
- 字符串的按字节截取
- CSS中Position 的用法
- vim配置文件,存档