2016-01-08 56 views
0

簡稱:怎樣的Android NDK系統進行改造, 「APP_ABI:= armeabi-V7A硬」 到位於「庫最後.so文件/ armeabi-V7A 「?在Android.mk中做同樣的事情的正確方法是什麼?目前,建立獨立的可執行文件,並將其放置在對應不同的ABI我用這個文件夾,這是它看起來是因爲硬編碼「IFEQ($(TARGET_ARCH_ABI),armeabi-V7A硬)」醜:的Android NDK:建立與BUILD_EXECUTABLE和armeabi-V7A硬脂肪二元

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
SAVED_NDK_APP_DST_DIR := $(NDK_APP_DST_DIR) 

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard) 
    NDK_APP_DST_DIR := assets/armeabi-v7a 
else 
    NDK_APP_DST_DIR := assets/$(TARGET_ARCH_ABI) 
endif 

LOCAL_MODULE := run_pie 
LOCAL_SRC_FILES := run_pie.c  
include $(BUILD_EXECUTABLE) 
NDK_APP_DST_DIR := $(SAVED_NDK_APP_DST_DIR) 

長:在我的Android應用程序中,我使用了一組獨立的二進制文件。生成後,它們存儲在APK資源中。在第一次啓動應用程序時,我將它們複製到我的應用程序私有文件夾chmod 777,並將它們用作系統實用程序,如「ls」或「cp」。我想生成「胖二進制」:單個APK具有所有ABI的二進制文件,並在安裝後爲當前設備選擇正確的二進制文件。 .so圖書館Android會自動完成所有這些工作。並且「APP_ABI:= armeabi-v7a-hard」是NDK構建系統的內部,它在文檔中有說明,並且最終的.so文件「armeabi-v7a-hard」被放置在「armeabi-v7a」文件夾中。我可以爲我的二進制文件做同樣的事情,目前我有辦法工作,但它看起來很醜。

將輸出二進制文件放置到以ABI命名的自定義文件夾並將「armeabi-v7a-hard」處理爲「armeabi-v7a」轉換的正確方法是什麼?

回答

1

如果你看看$NDK/build/core/setup-toolchain.mk,你會發現下面幾行有:

# compute NDK_APP_DST_DIR as the destination directory for the generated files 
NDK_APP_DST_DIR := $(NDK_APP_LIBS_OUT)/$(TARGET_ARCH_ABI) 
# install armeabi-v7a-hard to lib/armeabi-v7a, unless under testing where env. var. _NDK_TESTING_ALL_ 
# is set to one of yes, all, all32, or all64 
ifeq (,$(filter yes all all32 all64,$(_NDK_TESTING_ALL_))) 
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a-hard) 
NDK_APP_DST_DIR := $(NDK_APP_LIBS_OUT)/armeabi-v7a 
endif 
endif 

所以,你看,這是相同的方法,你在做Android.mk。唯一的區別是你沒有考慮到NDK測試系統內部的_NDK_TESTING_ALL_。因此,請繼續使用您的Android.mk,不要擔心。

另一種方法是像往常一樣構建可執行文件,但將其命名爲lib${TOOLNAME}.so。在這種情況下,它們將被置於默認的NDK_APP_DST_DIR以及真實的庫中,並且在設備上安裝時,Android Package Manager會將它們複製到適當的位置。然後,在第一次運行時,您可以從lib文件夾中複製它們(而不是像您當前那樣從資產中複製它們),然後重新進行適當的重命名。

+0

非常感謝,那就是我一直在尋找的東西。我試圖在NDK源代碼中找到那個地方,但是'setup-toolchain.mk'卻逃過了我的注意。目前我也在尋找提供者在運行時找到ABI的方法。我知道'Build.CPU_ABI','Build.CPU_ABI2'和'System.getProperty(「os.arch」)',但是我想知道它是如何在Android包安裝程序的源代碼中處理的,現在幾乎找到了。但是,您使用'lib $ {TOOLNAME} .so'的選項也很有趣,再次感謝。 – Dima