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

分类: J2SE   出处:iocblog整理  更新时间:2009-08-08   添加到收藏  

因工作的缘故,有机会接触了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();

    }[iocblog.net 来源]

}

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

  

  

第二步 编译java

eclipse工具中编译java类。编译后的class文件会自动放入工程目录下的bin目录中。[iocblog.net 来源]

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

windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:d:workspacejnitestin。键入javah -classpath d:workspacejnitestin 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 filesmicrosoft visual studiomyprojectshelloworld目录下面。

d:j2sdk1.4.2include目录下的jni.hd:j2sdk1.4.2includewin32jni_md.h两个头文件拷贝到vc安装目录下的d:program filesmicrosoft visual studio c98include目录下面。在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! ");

    return;

}

第五部 运行测试程序

先将生成的dll拷贝到jnitest工程的d:workspacejnitestin下面,然后设置dll搜索路径(环境变量path)为d:workspacejnitestinjni并没有规定必须将dll放在与class文件相同的目录,只要确保jvm能搜索到dll即可)③。重新启动elipse后,运行测试程序,将看到控制台输出“hello world!”

 

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


Tag: JNI



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。