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

参考资料

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

posted on 2009-03-20 11:13 何双华 阅读(84) 评论(0)  编辑  收藏


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


网站导航:
 
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

留言簿

文章档案

搜索

最新评论