天天看點

JNI入門JNI(Java Native Interface)

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中的方法名,于是去執行該方法。(當然以上過程肯定是有出入的,這裡隻是提出一個大概的思路)。