標籤:android java jni ndk
一、 JNI基礎介紹
JNI is the Java Native Interface. It defines a way for managed code (written in the Java programming language) to interact with native code (written in C/C++).
JNI(Java本地介面):定義一種方式,使得Java代碼能與C代碼或者Dynamic Shared Libraries(動態共用程式庫)進行互動。
調用方式:
C代碼通過編譯產生一個.so動態共用程式庫,供java代碼調用。
二、 NDK開發介紹
NDK 是 Google為Android提供做C/C++代碼開發的工具包,包含GCC的編譯器以及各個平台(arm,X86,MIPS)的相關標頭檔,交叉編譯的一些平台相關檔案等。可在google官網上下載。1、Eclipse配置下載的NDK資源套件位置
解壓下載的NDK包,android-ndk-r9b-windows-x86.zip
Preferences——>Android——>NDK,配置ndk所在位置
2、開發使用Demonew一個普通Android工程TestJni;
右鍵項目,Android Tools——>Add Native Support,輸入想要產生動態庫名字:TestJni;
此時,會多出一個jni檔案夾,包括一個TestJni.c和Android.mk檔案。
Android.mk 配置編譯相關動作,內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestJni
LOCAL_SRC_FILES := TestJni.c
include $(BUILD_SHARED_LIBRARY)
註:
BUILD_SHARED_LIBRARY:表示編譯目標為動態共用程式庫,即產生.so檔案
LOCAL_MODULE:編譯目標名
LOCAL_SRC_FILES:編譯源檔案
TestJni.c即本地C代碼,本例中只加了一個Hello字串的返回,此方法名的定義,為了使得java代碼能夠找到相應的native代碼,其規範為:Java+包名+class+Method,否則找不到。
當然可以有另外一種方法映射的途徑,可以實現java到C方法的映射,在此不詳細介紹了。
jstring Java_com_pingtech_testjni_TestJni_sayHello( JNIEnv* env, jobject thiz ){return (*env)->NewStringUTF(env, "Hello from JNI !");}
3、JNI java代碼
public class TestJni{public static native String sayHello();static{System.loadLibrary("TestJni");}}使用靜態代碼塊,首先載入TestJni.so 動態共用程式庫,sayHello為C中本地方法,前面加一個native修飾符即可。這個我們直接可以通過TestJni.sayHello();在Java代碼中調用C代碼了。4、編譯運行
Project build all,可檢測本地代碼錯誤,產生.so庫(lib/armeabi下,這個對於arm平台,當然可以通過配置編譯出其他平台的)。
Android NDK開發介紹