2013-10-14 73 views
2

我有一個小型的C++庫,必須針對armeabi和armeabi7a進行編譯。我也有一個非常大的C++庫,只需要爲armeabi編譯。現在他們正在編譯(使用NDK)兩種架構,但這使得我的.apk非常大。是否有可能將大型圖書館只編譯爲armeabi?我將如何做到這一點?Android NDK:編譯不同架構的不同庫

我的文件夾結構是這樣的:

/jni/biglib/ 
/jni/smalllib/ 
/jni/Application.mk 
/jni/Android.mk 

我/jni/Application.mk文件包含:

APP_ABI := armeabi-v7a armeabi 
APP_OPTIM := release 

我的根/jni/Android.mk文件結合了Android.mk每個庫的文件:

LOCAL_PATH := $(call my-dir) 
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include 

include $(addprefix $(LOCAL_PATH)/, $(addsuffix /Android.mk, \ 
    biglib \ 
    smalllib \ 
)) 
+0

你可以破解你的小模塊,從而'armeabi'版本在'armeabi7a'設備上執行時效果相當不錯? – mvp

+0

我不這麼認爲......這是第三方庫,它在文檔中說它必須分別編譯爲armeabi7a – slamnjam

回答

4

這絕對有可能。有一些代碼片段可以幫助你(沒有針對biglib和smallib的Android.mk的精確內容,我無法幫助你更多)。

1)將APP_ABI的訂單更改爲Application.mk中的APP_ABI := armeabi armeabi-v7a

2)修改根目錄Android.mk

LOCAL_PATH := $(call my-dir) 
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include 

# biglib is not built for armeabi-v7a 
ifneq "$(TARGET_ARCH_ABI)" "armeabi-v7a" 
    include $(LOCAL_PATH)/biglib/Android.mk 
endif 

# ----- cut here ----- 
# Place this snippet to every module which needs biglib, or where convenient. 
# Now you will link against armeabi version of biglib. 
ifeq "$(TARGET_ARCH_ABI)" "armeabi-v7a" 
    LOCAL_LDFLAGS += $(LOCAL_PATH)/../obj/local/armeabi/libbigLib.so 
endif 
# ----- cut here ----- 

include $(LOCAL_PATH)/smalllib/Android.mk 

並且那所有 - 你apk文件現在不包含libbiglib.so爲armeabi-V7A

+0

這適用於編譯,但它現在在運行時崩潰在armeabi-v7手機上,因爲Android是在armeabi-v7a文件夾中查找libbiglib.so,但未找到它。有沒有辦法讓它默認使用v7手機上的armeabi版本?我得到:java.lang.UnsatisfiedLinkError:無法加載biglib:findLibrary返回null在java.lang.Runtime.loadLibrary(Runtime.java:429) – slamnjam

+0

@slamnjam:日誌說明哪個庫它找不到,並且在哪個目錄中?你在靜態構造函數中有兩個'system.load()'語句嗎? –

+0

@AlexCohn是的,每個庫都由一個不同的類使用,其中相關庫在靜態構造函數中加載。實際上,我檢查了設備,並且大型庫甚至未安裝在設備上的libs文件夾中。我創建了一個新的問題來解決這個問題:http://stackoverflow.com/questions/19366009/android-ndk-use-same-library-across-different-abi-architectures – slamnjam