1. 程式人生 > >Android NDK編譯本地檔案以及引用第三方so檔案

Android NDK編譯本地檔案以及引用第三方so檔案

引用第三方的so檔案很簡單,在工程目錄的libs資料夾下新建資料夾armeabi,以及armeabi-v7a,然後將要引用的so檔案分別複製到這兩個

資料夾下就行了。但是有時候我們會使用第三方開源演算法,或者本地的底層程式碼,那麼在呼叫這些程式碼的介面時就需要將這些程式碼編譯成so

檔案,如果你使用的是cygwin事先將這些程式碼編譯成so檔案,然後將其複製到相應檔案下那麼不會有什麼問題,但是如果使用的是android

自帶的編譯工具NDK進行編譯時,armeabi以及armeabi-v7a資料夾下的第三方so檔案將會被刪除,只會產生編譯後的so檔案,其他的so文

件將無法引入,現在我們就來解決:在需要引入第三方的so檔案的情況下,怎樣使用NDK編譯原生代碼。

一、新建jni資料夾,將你要編譯原始碼檔案以及需要引入的so檔案複製到jni檔案目錄下

二、編寫android.mk檔案,首先將你的將你的原生代碼檔案的android.mk部分的程式碼寫好,然後在這部分後面新增需要引入的so檔案的程式碼

如:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libspeex
LOCAL_CFLAGS = -DFIXED_POINT -DUSE_KISS_FFT -DEXPORT="" -UHAVE_CONFIG_H
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_SRC_FILES := speex.cpp

include $(BUILD_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := liblocSDK3
LOCAL_SRC_FILES := liblocSDK3.so

include $(PREBUILT_SHARED_LIBRARY)

我們編寫了本地的speex.cpp檔案,但是還需要引入百度的定位SDK的so檔案,首先我們編寫speex.cpp檔案的android.mk部分,然後在其

後新增上第三方so檔案引入的android.mk部分。

include $(CLEAR_VARS)
LOCAL_MODULE := liblocSDK3
LOCAL_SRC_FILES := liblocSDK3.so

include $(PREBUILT_SHARED_LIBRARY)
以上部分就是百度定位sdk的so檔案引入時的android.mk部分的編寫,如果你還需要其他的so檔案呢,你只需要在這部分的後面再加上這樣

的程式碼,然後將名字替換成那個so檔案的名即可。

編寫好了之後,我們編譯工程,最後我們會在armeabi等資料夾中,看到兩個so檔案,libspeex.so以及liblocSDK3.so檔案,如果你是直接

將需要引入的so檔案匯入到armeabi資料夾下,那麼編譯後你將只會看見libspeex.so檔案。

參考連結: