Java中JNI的使用詳解第一篇:HelloWorld
今天開始研究JNI技術,首先還是老套路,輸出一個HelloWorld:具體流程如下:在Java中定義一個方法,在C++中實現這個方法,在方法內部輸出“Hello World",然後再回到Java中進行呼叫。分為以下步驟:
第一步:在Eclipse中建立一個類:JNIDemo
其中sayHello就是要在C++中實現的方法。
第二步:使用javah命令將JNIDemo生成.h的標頭檔案:
命令如下:
E:\workspace\JNIDemo\bin>javah com.jni.demo.JNIDemo
注意:
1. 首先要確保配置了Java的環境變數的配置,不然javah命令不能用,具體怎麼配置見:http://blog.csdn.net/jiangwei0910410003/article/details/17463173
2. 我的Java專案是放在E:\workspace中的,所以首先進入到工程的bin目錄中,然後使用javah命令生成標頭檔案
3. javah後面的類檔案的格式:是類的全名(包名+class檔名),同時不能有.class字尾
命令執行成功後會在bin目錄中生成標頭檔案:com_jni_demo_JNIDemo.h
但是我們還需要注意一個問題,就是如果我們的包含native方法的類,如果引用其他地方的類,那麼這時候進入bin\classes\目錄下會出現問題提示找不到指定的類,這時候我們需要切換到原始碼目錄src下執行即可。
第三步:使用VC6.0生成.dll檔案:
首先建立一個dll工程:
在.cpp檔案中輸入如下程式碼:
說明:
1. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)
{
cout<<"Hello World"<<endl;
}
這個方法的宣告可以在上面生成的com_jni_demo_JNIDemo.h標頭檔案中找到,這個就是Java工程中的sayHello方法的實現
2. 這裡編譯會出現幾個問題:
(1):會提示你找不到相應的標頭檔案:
這時候需要將jni.h,jni_md.h檔案考到工程目錄中,這兩個檔案的具體位置在:
java的安裝目錄中的include資料夾下,jni_md.h這個檔案在win32資料夾中,找到這兩個檔案後,將其拷貝到C++的工程目錄中;
(2) 當拷貝到這兩個檔案之後,編譯還是提示找不到這兩個檔案:主要原因就是#include<jni.h>這個是從系統目錄中查詢jni.h標頭檔案的,而我們只把jni.h拷貝到工程目錄中,所以需要在com_jni_demo_JNIDemo.h標頭檔案中將#include<jni.h>改成#include "jni.h",同理在jni.h檔案中將#include<jni_md.h>改成#include "jni_md.h"
(3) 同時還有一個錯誤就是,提示:e:\c++\jnidemo\jnidemo.cpp(9) : fatal error C1010: unexpected end of file while looking for precompiled header directive,這個是預編譯標頭檔案讀寫錯誤,這時候還要在VC中進行設定:專案-》設定-》C/C++;在分類中選擇預編譯標頭檔案,選擇不使用預補償頁首:
這樣,編譯成功,生成JNIDemo.dll檔案在C++工程中的Debug目錄中
第四步:將JNIDemo.dll檔案新增到path環境變數中:
注意:在使用者變數中的path設定,用分號隔開: ” ;E:\C++\Debug“,這樣就將.dll檔案新增到環境變數中了
第五步:在Eclipse中呼叫sayHello方法輸出"Hello World":程式碼如下:
System.loadLibrary方法就是載入JNIDemo.dll檔案的,一定要注意不要有.dll字尾名,只需要檔名即可;
注意:執行的時候會報錯:
這個提示就是沒有找到JNIDemo.dll檔案,這時候我們需要關閉Eclipse,然後在開啟,執行就沒有錯了,原因是Eclipse每次開啟的時候都會去讀取環境變數的配置,我們剛才配置的path,沒有立即生效,所以要關閉Eclipse,然後從新開啟一次即可。
至此,一個簡單的JNI例子到此演示完畢,後續還有更高階的應用,要及時關注呀!