JNI(Java Native Interface)
執行個體:采用jni,調用C語言編寫的dll,該dll負責列印出“Hello World,^_^. JNI……..”
1、 編寫java程式:
1):HelloWorld.java
Public class HelloWorld{
Static{
System.loadLibraray(“HelloWorld_C”); //這個名字就是dll檔案的檔案名
}
Private native void showHelloWorld();
Public void printHelloWorld(){
showHelloWorld();
}
}
2):cmd javac HelloWorld.java 生成HelloWorld.class
3):cmd javah HelloWorld 生成HelloWorld.h
内容如下:
4):編寫包含main函數的類:HelloWorld_Test.java
public class HelloWorld_Test {
public static void main(String[] args) {
new HelloWorld().printHelloWorld();
}
}
5):cmd javac HelloWorld_Test.java
2、編寫HelloWorld_C.c
#include “jni.h”
#include “HelloWorld.h” //這個就是剛才用javah指令生成的那個檔案
JNIEXPORT void JNICALL Java_HelloWorld_showHelloWorld(JNIEnv * env, jobject obj){
//這個方法就是上圖紅色框住的部分,方法簽名必須一樣,不過要加上形參名字:JNIEnv * env, jobject obj
//方法體裡寫具體實作
printf(“Hello World,^_^. JNI……..”);
}
3、通過使用vs2010 的 “Visual Studio 指令提示(2010)”,輸入如下指令:
cl –LD HelloWorld_C.c //就是剛才編寫的c檔案,然後生成如下檔案
注:1)、HelloWorld_C.c儲存格式最好采用Unicode編碼
2)、并非一定要使用vs2010的這個工具,肯定存在其他工具。由于本機上安裝有vs2010,是以使用它了。至于還有其他哪些工具,這裡就沒有具體研究了。
3)、使用vs2010的這個工具時,需要将jni.h檔案與HelloWorld.java檔案放在一起。其實是和HelloWorld.h檔案放在一起。
4、cmd java HelloWorld_Test,結果如下:
總結:從main函數入口開始執行,發現需要調用本地方法,于是去加載指定的dll檔案。但是到底執行該dll裡的哪個方法呢?會根據本地方法名按照某種特定的算法計算出該dll中的方法名,于是去執行該方法。(當然以上過程肯定是有出入的,這裡隻是提出一個大概的思路)。