使用JNI開發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會認為你的程序沒有任何修改是不會自動編譯的。