用JNI调用C或C++动态联接库原来如此简单

 
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目录中。
第三步 生成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下面。这里,我折腾了不少时间,才搞定。
 
 
参考资料
 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值