浅谈JNI的使用--java调用dll

Posted on 2010-12-07 08:40 杨书童 阅读(851) 评论(0)  编辑 收藏 引用 所属分类: 基础知识-基础语言

什么是JNI?Java Native Interface(Java本地接口)的简写。使用这个接口,可以轻松实现java对动态链接库Dynamic Link Library(dll)文件的调用,以实现一些C/C++的功能
本文章参考自网络一篇文章,做了一些小改动和补充说明。
一、建立java文件
注意点:1.要对dll里面的方法做本地声明
                2.加载dll
示例代码:
public class testdll {
 static{
  System.loadLibrary("goodluck"); //注意:不写扩展名,名字要与dll的文件名一致
 }
 public native int getValue();
 public native void setValue(int i);

 /**
  * @param args
  */
 public static void main(String[] args) {
  testdll test=new testdll();
  test.setValue(10);
  System.out.println(test.getValue());  
 }
}

二、编译
javac testdll.java                   ------如果没有错,进行下一步
javah testdll                           ------生成testdll.h这个头文件

三、实现步骤一中声明的方法
打开VC++6.0,建立一个dll空工程,把testdll.h导入工程中,新建一个test.cpp源文件
打开testdll.h,发现里面有两个方法:
/*
 * Class:     testdll
 * Method:    getValue
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_testdll_getValue
  (JNIEnv *, jobject);

/*
 * Class:     testdll
 * Method:    setValue
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_testdll_setValue
  (JNIEnv *, jobject, jint);

JNIEXPORT不用管,第二个单词jint/void是返回值,jint相当于int类型,JNICALL不用管,每一个方法名前都有前缀Java_testll_,前两个参数JNIEnv *和jobject不用管,第二个方法的第三个参数jint就是java文件里的int i。
上面有声明了,现在就要实现这两个方法,把代码补充进来吧:)
示例代码:
#include "testdll.h"
int i=0;
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject){
 return i;
}
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint j){
 i=j;
}

四、编译
此时编译会出现error,主要是提示找不到jni.h(这个包含在testdll.h)里,需要我们把jni.h、jni_md.h复制到C:\Program Files\Microsoft Visual Studio\VC98\Include这个目录里(默认安装目录,如果安装VC不是这个目录,请自行找到Include目录)。
jni.h------------------jdk安装目录\include
jni_md.h------------jdk安装目录\include\win32
然后再编译,构建,就有了test.dll这个动态链接库文件了,把它重命名成goodluck.dll,然后复制到testdll.java的目录下,运行吧:)
java testdll
结果:
10


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理