網路上有很多例子,有的使用VC6.0、有的用JCreator,
就是沒有Netbeans + Visual Studio 2005的範例。
因為環境不同造成設定path的地方不同讓自己找很久,
有些是重點卻沒也說清楚,因此自己發了這教學。
JNI(Java Native Interface)其實也是將c code包成dll檔案,
讓java去呼叫且執行。
開發環境:Netbeans, Microsoft Visual Studio 2005
1.使用Netbeans新增專案,選擇Java Application
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7r8kAPDUJ7NzXJOjxlmyOQZiYRxrCcmcKjMKvEMU0UHd-D16XBFGOF6vZkngE-asat6ECO6ENGI2urU6JmwMs4PA9cyf3pc2TbGvOeg1-GfZfpcRnKyFBzSBl5X8kHiA7rbuu1q3UAM1t/s400/1.bmp)
2.專案名稱:JNIFirst
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU16AsRBfxbqlfqaXDfCLaptLUOvUmHtDaNO4G6Z5F_u5gvdjNuF1FsJUkJDOU7ddbUJHTveBtUsPwQ_fO51uTXSWRe3_e9_dWvirTpndEkWuudR1DFZ2RoyGlkFxemokQ0Kaq-nLKT3hU/s400/2.bmp)
3.新增Java Class檔
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTLhfvBqhr4XEofoZ5OQqzICE2MB_4QOteTYvhVCW46Bwhqy3PsfZ_cvFXDo4drP2UBLP1p3X6o4b_ZjCbiiSJao0FjQyRC4rnl9xcUW2u1YaVnlppQVELFsT9dRS_PJcow33e9G5WEelL/s400/3.bmp)
4.檔名:JNIHello,注意不要將JNIHello.java包在package內,不然編譯.h檔時會error。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEistQ2-r-16RT5V5_13U0VhUeuUVpS1Y_0PRVL4nP5BY7UvuYyV_gLIZvKFjh_jDdAzTHROREu78QQ5TcKrR8KG0Xcfw-OGv9h3KdZcXA2IiPGKkq8uSvIC24gQfjBA4wFfUoutMSTPHwEU/s400/4.bmp)
5.撰寫JNIHello.java內的code
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiHQisUnTGEOPD0PwT0Nybp4VZZifnqSgiqVoX1LjV8JVIALgNodh9VsvRzUXVfvmZ9NiOQ2ZTNeAC8x6MFiBYQ-QTfWDCnfhJXgj_s-6Eo58VcRmZf4WbJVr9Dq3pAk3QuhkxeBeohlIw/s400/5.bmp)
6.接下來要產生.h檔,要用commend line的方式下指令,若你的電腦尚未設定用cmd下java指令的 話可以參考我寫的這篇"設定java環境變數使cmd能下javac等命令";首先要先切換到JNIHello.java檔的目錄下,下指令產生.class,再用class檔產生.h檔,指令:
javac JNIHello.java
javah -jni JNIHello
(2010.1.25新增:要是有package, 輸入指令javah -jni [PACKAGE].[CLASSNAME],並注意要移到package的上層資料夾.)
(2010.8.30新增:修改package名稱請檢查三部分-----1.重新產生.h檔 2.修改include檔名 3.修改function名稱. )
如圖中。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikho8MJTeZ0wPom464PyurmuUjT4rVn5hLgEADDZL_RVkperaWHVlUbrzM_FEzTY6kiwVAV30_Tu2DOg5jp0DYtMUFZvGDfDiEM2kZWPZcFFio7kBtg71SmzyeBkvWSOL5vQUjc2_TO1ZD/s400/6.bmp)
7.Netbeans使用暫告一段落。開啟Microsoft Visuall Studio 2005,新增專案選類別庫(library),
專案名稱:JNIHelloWorld。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidJLd6VIPZdaWtuYfe0qKjO2eDu8yIXhmUnl5xN2yrH6mOTOsytroWtpLqsudGtdm7AYkh6O6Qwp_0Bl-HtHjiRugYCXBQsmYrWahTXI0LyHiko1MWp4NY_1M2ZY3k38bn_D6FCM6XLd8j/s400/7.bmp)
8.將剛剛由Netbeans產生的JNIHello.h檔copy到此Project的JNIHelloWorld目錄下。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioNOQN8UpNhtQe8rvw5Njh67HwMHUgkWyiBPbZmGSgVz7zJ3WMRX-RQXj0RBLEd8O8a7-nAFNfkymZKpDyixo8nKLCVU2koZZoL2idiJ_12yIU3n5ktOrVd9xBmVV-4av65SjJq3eLo8br/s400/8.bmp)
9.將專案自動產生的JNIHelloWord.h刪除,加入我們剛copy進來的JNIHello.h檔。(當然也可以在新增專案時將名稱設為JNIHello,這樣就不用改名稱直接覆蓋即可,此處為了要說明.h檔與Project的關係故意取不同名稱。)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6-v9EhzuE8H4aScbJ6UniTeFr_qKZgalIM7-w47I1TX37_aEg5UICnNXAg0Frd-SRJssWslWRJNUpQ7gla_k_ygbU0VJcVguuijNxJf-HOupxLa03TxtDYaClJDhv8_VpE9pu-_FC26NV/s400/9.bmp)
10.加入JNIHello.h。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHWZjpHf8mMqtpNgRvTedm930SOFWoLdGSEFcMP5NZmzWNaMBl1GGOHNM3934ikXAPjd85sIxLTfq2UpY0_cmOFrqBgt9eS_0bObILf5vM2j3gVcYgAhYzHkBaarkSIkX-iQTl7-5UBPgd/s400/10.bmp)
11.打開JNIHello.h檔看一下紅框處,function name為Java_JNIHello_printHelloWorld,撰寫cpp檔時就要用這個function。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4uQ4L6Ho7xFaws7ELno0qVHf64af6asXbIrTERajQkECHQBogxDsbsI8Q8VrI2dvsmdJBl6RQl2p9jhSJ4hjWrcO4JAPuQm_Po9wPXv78ra9jsakrigrpVQnWV-sO7_71l4YQm24aaRnt/s400/11.bmp)
12.撰寫JNIHelloWorld.cpp,code如圖中。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggVG6yyc9egbxN2aztbCj89GU7C-U6N3xf3Nk1iAI_nj3V2QNcJUDjwrrI71pdRMnnPjtyU-_rRWif-DyQWfg9Q3_AIfV85vYeTsPZfX5xe6eNhXfl6ea6_wtTPW-qRgdc2blRRX5IL7rN/s400/12.bmp)
13.因為有include"jni.h"所以要設定VC的path讓它找的到。選工具->選項。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmZsmZX2z5ckJcO6-sJiULp60A8k8mx3xwrtdESY_Ixb88EBFf-fEmOmrKXXadRR8DQVSyG5uD7a3ifDb1ZDFNKzWkpqBejMiwY3XmQfSfLICSiprI8h4mngT6OSQVEIlUY_5alGOilb69/s400/13.bmp)
14.選VC++目錄,include檔案,新增path。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUFXytkqlcFAGTvOnpf06unCasvg-eRv8Ou5rKzo6xxaCFtgHvgDGsRkhntgWrodt-PDe8lwtFD8zU3pveSMJ-ZlHHCqeJTYF6i47YDs8H5_X_GWJ_poKY0xn7p2sQvFO4sL-VZprQmIXN/s400/14.bmp)
15.設定好之後可以來產生.dll檔案了,選擇建置方案或按F7。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFUC2Wespvrdn_CBJpf-j3vXiYnVc6eHEj2xDm405IFgbVR80AwQoxS6LQ5qopmEv-tvI6cdsg6plqHy3smRnOPbWFjTJPu9wz-KoPwtA3K4WsSjX8u_GdMIWm-izk5iU7Bb-A9Ft5yPBD/s400/15.bmp)
16.建置完成會產生JNIHelloWorld.dll,注意檔案是產生在JNIHelloWorld Project目錄下的debug,d為小寫,不是產生在JNIHelloWorld->JNIHelloWorld->Debug;將dll複製到Netbeans的Project目錄下。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlS6pjoFGAvd9IdRyIr0ep6c8_uPbFpPgftbZ6KMOn3jt-05W5HaYUtqGHFUKboEnclk06e3BjU1SeMctvhkvQfkBeJbQUdTbXM3ov_oEfbDFeqJNR6UwLVnNKfklxXagkSIgwcmiVfHXG/s400/16.bmp)
17.開Netbeans,看一下我們剛寫JNIHello.java,由於dll的檔名為JNIHelloWorld.dll,所以要將紅框處修改為JNIHelloWorld。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwsJjW-JFn-BggT7I4HWL8p_aV19nacNCRhxd2P5QKXyD-k4AhQ0R1KTusHjVb_wuYTq_xuO3Imb7zq4B541G3cSTgt8iaM1_UB62rHHSEeccWheaIGDfwbz-rYJJTHzBf5xiIGejekRDo/s400/17.bmp)
18.現在來建置一下看看結果是否成功,選run main project。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAytXa-P4jhI4M_JSGHHPAwwkrcqnZtSCRmDNeaKOEoadPW9EHb4hjzDK7Q5X-WOsTQE2v0cvu5XtBoYx3BPjj80VBE99iVUV2yV_kHP_yVL8OOcgB8s76ajfIbFqlKkfgfFxhMoubgarU/s400/18.bmp)
19.秀出Hello World!。成功囉!
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHWCScPA-Cks9APUdpQhVV5SujSAOqkIMizczA4iN59fx2bCHoGd7W-6FdY9QSa3XEL5oXkMGuqCo3HnxjVKw9A32qugv9yXeouz97ZSe5DisXclBItRzuw1nvaM7STeDD7eEW4I1fHho1/s400/19.bmp)
轉載請註明出處,enjoy。
By SHIH-WEI 2009.11.11
http://zwe0405.blogspot.com/2009/11/jni.html