最近復習C語言和java語言(10年沒用了,溫習一下),用JNI調用C語言的dll測試,以前沒做過,在網上找了很多,總結如下:
環境:windows 10(64位) + JDK(32位,版本1.7.0_79) + MinGW(32位),注意JDK和MinGW要么都是32位,要么都是64位,不能一個是32位另一個是64位。
java和MinGW的環境配置在網上查找。
一、【不用eclipse,用記事本手工編輯 .java和 .c 程序】
1、hello.java代碼如下:

2、編譯Hello.java程序命令:javac Hello.java --生成Hello.class文件。
3、生成Hello.h文件命令:javah Hello --生成Hello.h頭文件,該頭文件在C語言編碼中要用到,所以將Hello.h存放到后綴為 .c 文件代碼相同的目錄。

4、arr.c文件內容如下:

5、C編譯環境准備:需要將JDK對應的 jni_md.h 和 jni.h 兩個文件拷貝到MinGW的安裝目錄的include目錄下。
jni_md.h在 %JAVA_HOME%\ include\win32目錄下; jni.h在%JAVA_HOME%\ include目錄下。
如果不想拷貝,則在下面的6步命令末尾需要添加如下內容:
-I"C:\Program Files (x86)\Java\jdk1.7.0_79\include" -I"C:\Program Files (x86)\Java\jdk1.7.0_79\include\win32"
其中,JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_79. 根據自己的JAVA_HOME路徑修改。
添加雙引號是因為gcc命令行解釋不了”Program Files (x86)“中的空格字符。
6、編譯生成 hello.dll 動態庫文件命令:
gcc arr.c -shared -o hello.dll -Wl,--kill-at
命令解釋:
-shared -o hello.dll /* 指定編譯生成的目標文件 hello.dll是動態庫文件 */
-Wl /* 告訴編譯器將后面的參數傳遞給鏈接器 */
-Wl,--kill-at /*告訴鏈接器去掉函數名稱后綴的@符號 --該問題涉及比較深入的東西,暫時不管,只管按命令執行,生成 .dll 文件,實現測試目的。*/
7、檢查測試目錄 E:\test下的文件如下 :

8、執行 java Hello,成功!
二、【使用Eclipse編輯】
使用 eclipse 編輯的區別主要在 JAVA 源程序常常裝在 package 中,所以需要特別處理一下:
1、編輯完成 .java 代碼后,就用eclipse 編譯成.class文件。
2、使用javah -o E:\test\com_test_HelloWorld.h -classpath $ProjectPath\build\classes com.test.HelloWorld
$ProjectPath :該路徑指eclipse中生成HelloWorld.java項目的路徑。
注意:com.test.HelloWorld這個名稱一定要按自己的 package 順序寫完。
3、使用命令行生成JNI格式的C語言頭文件.h文件:
gcc arr.c -shared -o 希望存放的路徑\hello.dll -Wl,--kill-at -I"JDK安裝路徑\include" -I"JDK安裝路徑\include\win32"
希望存放的路徑:指生成的hello.dll文件存放路徑。
JDK安裝路徑: 指自己的JAVA_HOME目錄路徑。
4、在 eclipse的項目配置中(右鍵項目名稱->Build Path -> Configure Build Path,然后選擇 Java Build Path ,在右邊的Source 頁展開當前項目;
然后,選中Native Library Location,點擊“Edit” ,再選擇“Workspace”,將第3步生成的 .dll 文件目錄添加到項目中。
5、運行HelloWorld,成功!
三、JNI測試常見錯誤 java.lang.UnsatisfiedLinkError:
參考:http://blog.csdn.net/binyao02123202/article/details/18075747
http://blog.csdn.net/niuxinlong/article/details/4176612
