A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

JAVA中JNI调用C动态联接库
前言
    java是一个翻译型的编程语言,虽然比起C语言这种靠近底层的语言运行要慢点,但是覆盖面积和用途是十分的广。
    它们都有自己的特点和好处,这两个编程语言不单单是两个独立的个体,其实还有紧密的联系。
    什么样子的联系,它们是可以互相之间进行代码上的调用。
   

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

第一步 编写Java类

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

这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLL。
HelloWorld类包含一个本地方法displayHelloWorld(),
TestDLL用于测试这个本地方法。

HelloWorld的源码清单如下:



  
[Java] 纯文本查看 复制代码
  List1. HelloWorld.java源码

    public class HelloWorld {
    public native void displayHelloWorld();①
    static{
    System.loadLibrary("HelloWorld"); ② 
    }
    } 



说明:①是java本地方法申明;②装入动态链接库,"HelloWorld"是要装入的动态链接库名称。



[Java] 纯文本查看 复制代码
    TestDLL源码如下:

    List2. TestDLL.java源码

    public class TestDLL {

     public static void main(String[] args){
    HelloWorld helloWorld = new HelloWorld(); 
    helloWorld.displayHelloWorld();
     } 
    }





第二步 编译Java类

在Eclipse工具中编译Java类。编译后的class文件会自动放入工程目录下的bin目录中。

第三步 生成C/C++头文件

在windows中打开一个命令窗口,
进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。
键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。

内容如下:
* 注意,不要修改这个头文件。



[Java] 纯文本查看 复制代码
    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源码



[Java] 纯文本查看 复制代码
    #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下面


###总结###
    使用JNI的好处:
    a、可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们,一般是在java中调用C的函数;
    相反的也可以用C来调用Java中的方法,这样可以复用很多以前写过的代码。

    b、JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。
    本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。   

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马