JNI的方式調用DLL(SO)(上)


      最近有個項目要調用原有的DLL文件,本來准備使用JNA,可是客戶不同意,非要使用JNI的方式。萬般無奈之下,只能重新使用JNI,現將JAVA調用動態鏈接庫的一般方法總結如下。

      JNI是Java Native Interface(JAVA本地調用)的縮寫。從Java1.1開始,Java Native Interface(JNI)標准成為java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他語言,只要調用約定受支持就可以了。

      使用JNI調用DLL文件的步驟一般有以下幾步:

         1、編寫帶有native聲明的方法的java類

         2、使用javac命令編譯所編寫的java類

         3、使用javah命令編譯成頭文件 

         4、使用C/C++實現本地方法(包含第3步生成的頭文件)

         5、將C/C++編寫的文件生成動態連接庫

      下面將通過實例詳細介紹上面5步的具體實現

–> 編寫帶有native聲明的方法的java類,代碼如下:

View Code
 1 package com.wanggc.jni;
 2 
 3 public class MyJniNativeMethods {
 4     /**
 5      * 取最大值。
 6      * 
 7      * @param data1
 8      *            數據1
 9      * @param data2
10      *            數據2
11      * @return
12      */
13     public native int getMaxData(int data1, int data2);
14 
15     /**
16      * 向某人問好。
17      * 
18      * @param name
19      *            人名
20      * @return
21      */
22     public native String getGreeting(String name);
23 
24     /**
25      * 加載動態鏈接庫
26      */
27     static {
28         System.loadLibrary("testJni");
29     }
30 
31     /**
32      * 入口主函數。
33      * 
34      * @param args
35      */
36     public static void main(String[] args) {
37         MyJniNativeMethods jniTest = new MyJniNativeMethods();
38         // 調用第一個本地方法得到兩個數中的最大值
39         int maxData = jniTest.getMaxData(100, 150);
40         System.out.println(maxData);
41 
42         // 調用第二個本地方法想某人問好
43         String hello = jniTest.getGreeting("王國成");
44         System.out.println(hello);
45     }
46 }

      13行和22行包含了兩個本地方法,getMaxData和getGreeting,注意本地方法只需有方法名,不需要方法體。需要使用native關鍵字修飾。27-29行用於加載動態鏈接庫。注意DLL文件不要后綴,只要名稱就可以了。

–> 使用javac命令編譯所編寫的java類,如果是用eclipse編寫的代碼,不須使用此命令,使用project菜單的clean選項編譯一下就可以了。

–> 使用javah命令編譯成頭文件 

     編譯好class文件后,打開CMD窗口,轉到bin目錄,運行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM