首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 笔记本电脑 | 北大青鸟 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> J2EE >> J2ee核心 >> 正文

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

因工作的缘故,有机会接触了Java本地方法调用(JNI)。本文中记下了初试JNI的过程和一点点体会。

使用JavaJNI调用C/C++的动态联结库有个固定的步骤,下面将以一个最简单的HelloWorld例子程序来说明调用过程。这个HelloWorld的例子只是简单的显示HelloWorld消息。

  

第一步 编写Java

首先,我们创建一个名为jnitestEclipse工程,并新建一个src源代码目录。

这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLLHelloWorld类包含一个本地方法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.hD:\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\binJNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可)③。重新启动Elipse后,运行测试程序,将看到控制台输出“Hello World!”

 

注意,③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面。这里,我折腾了不少时间,才搞定。

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·Oracle外键及外键约束修改行为
 ·开源软件测试工具学习专题
 ·JSP Web开发 入门基础到高手进阶教程
 ·JavaFX—是Java桌面的新希望么?
 ·安全至上 .NET开发安全策略
 ·测试用例设计之道-测试用例学习专题
 ·面向Java开发人员的Scala指南
 ·Java设计模式之实例详解
 ·Oracle数据库11g 面向DBA和开发人员的重要新特性
 ·桌面应用软件编程 J2SE技术详解
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航