coolfiry

认认真真做人,兢兢业业做事!
posts - 39, comments - 17, trackbacks - 0, articles - 0

用JNI调用C或C++动态联接库入门

Posted on 2006-09-09 16:30 Coolfiry 阅读(534) 评论(0)  编辑  收藏 所属分类: Java

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 下面。这里,我折腾了不少时间,才搞定。

参考资料

Java Native Tutorial
源代码下载
(http://www.matrix.org.cn/resource/article/44/44606_用JNI.html)


只有注册用户登录后才能发表评论。


网站导航: