JNI调用C或C++动态联接库入门
因工作的缘故,有机会接触了java本地方法调用(jni)。本文中记下了初试jni的过程和一点点体会。
使用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目录中。[iocblog.net 来源]
第三步 生成c/c++头文件
在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:d:workspacejnitestin。键入javah -classpath d:workspacejnitestin 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 filesmicrosoft visual studiomyprojectshelloworld目录下面。
将d:j2sdk1.4.2include目录下的jni.h和d:j2sdk1.4.2includewin32jni_md.h两个头文件拷贝到vc安装目录下的d:program filesmicrosoft visual studio c98include目录下面。在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! ");
return;
}
第五部 运行测试程序
先将生成的dll拷贝到jnitest工程的d:workspacejnitestin下面,然后设置dll搜索路径(环境变量path)为d:workspacejnitestin(jni并没有规定必须将dll放在与class文件相同的目录,只要确保jvm能搜索到dll即可)③。重新启动elipse后,运行测试程序,将看到控制台输出“hello world!”
注意,③必须设置好dll搜索路径,或者将dll拷贝到c:windowssystem32下面。这里,我折腾了不少时间,才搞定。
Tag: JNI
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。