使用JNI開發Android應用

jopen 11年前發布 | 16K 次閱讀 Android Android開發 移動開發

        JNI是Java NativeInterface的縮寫,中文為JAVA本地調用。從Java1.1開始,Java Native Interface(JNI)標準成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。


        JNI的作用是讓你在利用強大android平臺的同時,使你仍然可以用其他語言例如C和C++等寫程序。 作為JavaVM的一部分,JNI是一套雙向的接口,允許Java與本地代碼間的互相操作。




JNI在交互中的角色

1.JNI編程的一般步驟

l  創建一個類(HelloWorld.java)

HelloWorld.java

class HelloWorld{

    private native void print();

    public static void main(String[] args) {

newHelloWorld().print();

    }

    static {

     System.loadLibrary("HelloWorld");

    }

}

HelloWrold類首先聲明了一個private nativeprint方法. static那幾行是本地庫。在Java代碼中聲明本地方法必須有"native"標識符,native修飾的方法,在Java代碼中只作為聲明存在。在 調用本地方法前,必須首先裝載含有該方法的本地庫. 如HelloWorld.java中所示,置于static塊中,在Java VM初始化一個類時,首先執行這部分代碼,這可保證調用本地方法前,裝載了本地庫。

l  編譯該類生成class文件

用eclipse自動編譯成class文件或用命令行javac HelloWorld.java來編譯

l  利用javah -jni產生頭文件

javah -jniHelloWorld

"-jni"為默認參數,可有可無。上述命令會生成HelloWorld.h文件。

l  用本地代碼實現頭文件中定義的方法

必須根據javah生成的本地函數聲明實現函數,如下:

     #include

     #include

     #include"HelloWorld.h"

     JNIEXPORTvoid JNICALL

     Java_HelloWorld_print(JNIEnv*env, jobject obj)

     {

      printf("Hello World!\n");

      return;

     }

"jni.h"文件必須被包含,該文件定義了JNI所有的函數聲明和數據類型。HelloWorld.h是上一步我們用javah生成的頭文件

l  運行

最后用NDK編譯你的本地代碼并生成動態鏈接庫.so文件。請注意,生成的本地庫的名字,必須與System.loadLibrary("HelloWorld");待裝載庫的名字相同。

然后在eclipse當中重新編譯一遍android程 序。這里注意,你每一個改動本地代碼并重新生成庫都要手動的編譯一遍android程序或修改eclipse的java代碼使其自動重新生成程序,因為你 只修改本地代碼eclipse會認為你的程序沒有任何修改是不會自動編譯的。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!