Posted on 2010-12-07 08:40
楊書童 閱讀(861)
評論(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