1.配置好NDk編譯環境(這個Google一下,:))
2.將已有C/C++代碼,編譯成SO文件
3.Eclipse中新建Android工程,創建一個jni目錄。如下所示
4.在jni目錄創建C/C++文件,裏面調用步驟2函數,或者第三方SO的函數
5.創建Android.mk文件,內容爲:
LOCAL_PATH := $(call my-dir)
# Link libXXX.so
include $(CLEAR_VARS)
LOCAL_MODULE :=XXX
LOCAL_SRC_FILES := libXXX.so
#LOCAL_SRC_FILES := /jni/libXXX.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := XXXAgent
LOCAL_SRC_FILES := XXXAgent.cpp
LOCAL_SHARED_LIBRARIES := XXX
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
將XXX替換爲編譯出的SO或者第三方SO的名字
6.將jni目錄下的C/C++編譯成Android通過JNI調用的SO文件,這裏名字爲 libXXXAgent.so
7.Android工程中使用時,首先加載一下用到的SO庫,即可正常使用了。
System.loadLibrary("XXX");
System.loadLibrary("XXXAgent");
說明:這裏的重點是如何調用第三方SO庫,所有部分細節沒有表述。比如Javah生成相關頭文件,jni調用等。
補充:上面步驟可能比較多,這裏舉一個例子加以說明。某天,你得到一個第三SO庫,名字就叫XXX。你發現裏面的功能正好是你Android項目裏需要的,可以拿來就用。這個消息令你高興萬分啊那是。但是,如何在Android裏使用呢,XXX庫裏的調用約定不符合JNI規定,是不能直接來用的。哈哈,想到了,創建一個XXXAgent.so。它的調用採用JNI,然後在實現裏調用第三方SO就可以了。以上就是大概的思路。
SO文件是如何自動安裝到虛擬機或者手機上呢,NDK生成的SO文件會自動放到libs/armeabi目錄下。而此目錄下的SO文件都會自動打包到APK,安裝後釋放到/data/data/項目名字/lib/下。這裏XXXAgent.SO文件生成libs/armeab,XXXAgent.SO依賴XXX文件,XXX文件自動拷貝到libs/armeab下。(XXX文件放在jni下,和Android.mk同級,這個是和Android.mk裏的設置配合使用的)