JNI 是用來讓Java跟別種語言溝通的函式庫,以C/C++ 為例,分為C call Java與Java call C。
JNI整個流程(java call c 的範例)
開發環境:Netbeans, Microsoft Visual Studio 20051.使用Netbeans新增專案,選擇Java Application
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-JHkK-cYDV9xoWZEhdRNsosbWG-JrK5dVEt7kb6YI3EcICpiKcIWKObRM1LlilGeiaZBpPBtPEA6RSMOnbw-eSLspY8Hq5ZA2abTWxx_Pq8nms5AvVfApdtmAAGtiv-ca-u4m0-OAp3te/s400/1.bmp)
2.專案名稱:JNIFirst
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRCDbtQd4J_a0eTxkPi1FRPuiWK-6F8xXyIiMTSJnYh5a6YDaBNl30vcojuVH1CJuHESjPq9WRZlUcv1W8GBDrDMz1A5-oLBop-R3mZ7TqvZ3vwOD5NNcxWn3nPN2r-dZB8q7k6V4TLp0l/s400/2.bmp)
3.新增Java Class檔
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqbb26V4kztsjCUQPq4xN3CwEKDRM7tNK6zpDLcWGQwV77aL_G40Eq5X3w6PKCWhb67S0dmq0OSJ1BrIcmbUUIeLkHiwMnAdjeWsxs1ddTIfTIidNCGk2Qsczv1melnTVmT7QSN9PFpHeG/s400/3.bmp)
4.檔名:JNIHello,注意不要將JNIHello.java包在package內,不然編譯.h檔時會error。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBT-Egl04sTndaHAgsvSrhtB0qm1w-Kk8LY5aEtXQZCDbi75-Wsjl_nRdw9y5kjEmV48CAUDPJlqY4vlZS9kJEJ1nM8p-E6gcvrRZy6vOl17tjPvlQilFYEugtzL28mdm0EgRbWfiB5s5k/s400/4.bmp)
5.撰寫JNIHello.java內的code
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI1adrd3Al86I3i8Ym1BFLoCbWjPFKL9OIyC_941HmSfhER6xZF-6tES97OWxY6BCYWAX8hDpTqZUg3XeDgZ6k2RCeIqAp11RSP1dnaDRzpxWR8y1KPYwtHQgG6bvFWzj30yS8xRKb8Xjn/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/AVvXsEj4ewYOJNZBfrSzPwD1F28JSa6OzWWsRJsg3DjG_i59UlLlnmnZKML2wJ0h9LI3Iy3__vuyM0IOw4qf0LeWt5eUAVQCpIJzcw1cf682iRCcaM-9n8_YLTjM76DLYy42cFiBY0Vgkj45Oxsv/s400/6.bmp)
7.Netbeans使用暫告一段落。開啟Microsoft Visuall Studio 2005,新增專案選類別庫(library),
專案名稱:JNIHelloWorld。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNEsfeQ1KiUvaXQHNgTEQPrUtTCG4cPxD36X-FMQDyFlW_s7gT0uzVISvlphmsPx8KXbijGorhu35IDnUiF1NV8YMlJNlVI_5fS72de3oF3-KGz3PF7-3OQB3zYSXaxlHHYONDuG4ZT9bR/s400/7.bmp)
8.將剛剛由Netbeans產生的JNIHello.h檔copy到此Project的JNIHelloWorld目錄下。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvLkoDE4CPhnjf_hfMWnQXWNBzu1uJijTVkaUEOp4mzjYfgL1gkhbdh48Dfw5xsu90Vh0CTpR9w87TC5uIbwbTwTZfpI1442COHOlOmgiXKyyQEyByRB_xhAhLeBYEc8EkDuWtPOj0zQMn/s400/8.bmp)
9.將專案自動產生的JNIHelloWord.h刪除,加入我們剛copy進來的JNIHello.h檔。(當然也可以在新增專案時將名稱設為JNIHello,這樣就不用改名稱直接覆蓋即可,此處為了要說明.h檔與Project的關係故意取不同名稱。)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1ssHbH8XGWYESQbozvK9K3ojn9FBRsQNYFmNsiNnJR-s1xbxRuGXoejOiIZ8FqaJ5Nkp-DeL6Mff1tPy9hw8EHukLR9ZuKwReurtG46afeCrCWc37dYBYTDeA8jXgMg9LeA0WfH-gZWdM/s400/9.bmp)
10.加入JNIHello.h。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH3LFAqWElFLQ9mO1ARAkGLTf6mEbFFLXM5xZIIukGU7nj1HUCG9iKCKHTPFn-igdaj1InjEDvBjDmjfBQSf_VTR6Gk5ox7eu5LfluNewMlGBO2q4F2xhR2jcSJQotYAzUN5EmpvbwCoY6/s400/10.bmp)
11.打開JNIHello.h檔看一下紅框處,function name為Java_JNIHello_printHelloWorld,撰寫cpp檔時就要用這個function。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibwtw100zc8B6Cc0UvaAXadGuEkCNrNvlceNAbygp2WiSRo4eJGEn_0hQfvLowXlE0fid8i97AJhUWxiFvWe1ZCbybE883dBXkpE-pGtEsAWbJsPgcL0KNEGuxbw495AzVU-cb-gOlejOp/s400/11.bmp)
12.撰寫JNIHelloWorld.cpp,code如圖中。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlTbeC1nHbPbGLp_S4XvRL_KzC6PxCjOliKcfZf-nHPy3e9xOKQa2EzQ6bOaPTCtbBp8ANmNWJphpYTHqumJ_VUSiExHfHTmF77X5EbGOJhgP-32hPX50NK0JPtlrmoEd29O8CEmXSFWwW/s400/12.bmp)
13.因為有include"jni.h"所以要設定VC的path讓它找的到。選工具->選項。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNnz3BillA8AHkk9tXYtga0M4qTRBlCiwVZpe_r9y2G3leQ628LX1OGToHb_Hs_c5NgOWUToWkuq_pLnytBxyQUhw6iJ7jspEsIvBUDrPHQwC5wRdKrM1Ay0zWKVYMzQnECOeCA5ftyMmQ/s400/13.bmp)
14.選VC++目錄,include檔案,新增path。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheMTXNqMegO6z9ZoB_6vkE-5IYZ5NCbFC8E1NJ31JICYflCWZwiCGHrc0jQt1vhaGL8xqhGAeiMwbgZgmw79-S7iXPH17ayaILF7cO138RK0GCDBLGH3O_CKbiiOhJNJeJTp0GY_kraH3k/s400/14.bmp)
15.設定好之後可以來產生.dll檔案了,選擇建置方案或按F7。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFgEQAOrSP_30oqZi8xhyYKLw3YhrACxNYxQhKEg7VhBy1UPaTRUwSJCWohrWhp_U1j8IoZn6f0WVei4xuW2OVRBHGPmDGiMoFoKdT8gINvks78xRcPPEJUwBLFTKwNQ84QRGDbAS2Vh-/s400/15.bmp)
16.建置完成會產生JNIHelloWorld.dll,注意檔案是產生在JNIHelloWorld Project目錄下的debug,d為小寫,不是產生在JNIHelloWorld->JNIHelloWorld->Debug;將dll複製到Netbeans的Project目錄下。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIrmT3rPiKWb5W5hoVsceF85WCmv8f1VQabXJVa4Y6OHOW5bM_n7C_cKlJH1Z0-KIbfeJcsZB1iCeal0bcbS3uL8yZ9fF706VjQUJLhv21ctWmAVO1Dcjk7yd7FeiLlFS0PePRVIHbab7i/s400/16.bmp)
17.開Netbeans,看一下我們剛寫JNIHello.java,由於dll的檔名為JNIHelloWorld.dll,所以要將紅框處修改為JNIHelloWorld。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2FrRAEj5JLwJlZpPI25p7lJSh7ew_hbIQdrXxFepXHgkZJjvYHTRLtCsdoXn3D7CPlH8TeUnVIodyYxqwgxK5r70kPLnuoJRxx8VkV1R9IteFuCIpw0H5l_gEKMgmKBqCHDQHVkL192SY/s400/17.bmp)
18.現在來建置一下看看結果是否成功,選run main project。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHiTQqNgs_U_IRfIlsAt5ITouL0CSYhl4Skb8QduNiOKzY0meJE8AOKZgZYsZoH1hdp3SqP_LBTlal1W52eDs_XkvXjrjOCclT4DCIsMTmgOKoH__1CkmLYZ0cRciPumB3FUiB7gHIDPTy/s400/18.bmp)
19.秀出Hello World!。成功囉!
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTuKLYBLk8c_O6QpQuaEOfWpYG6uty-ys77MgVZ4dk9XS3H6YVkhD7VgR9WqwzZIGfSw6Naa1JWLaClhCiVZ7PmYXRk4Swt10phRnkkaiNjFYpWj89gjp6A_6xdfwj90rG90fMWCErasYa/s400/19.bmp)
JNI下的Java資料型別
資料來源: