簡體   English   中英

如何為 NDK static 庫編寫/調試 Android.mk?

[英]How to write/debug Android.mk for NDK static library?

我正在嘗試使用最新的 Android NDK (r5) 構建 static 庫,但我沒有任何運氣。 我已經能夠毫無問題地構建和運行示例(例如,HelloJni),但從“零”開始一個新項目卻是另一回事。

對於這個實驗,我正在嘗試構建 libpng。 我的文件夾結構如下所示:

root
|
+--- jni
      |
      +---- Android.mk ( one line: "include $(call all-subdir-makefiles)" )
      |
      +---- png
             |
             +---- Android.mk ( see below )
             |
             +---- { a bunch of .c and .h files )

所以我有兩個 Android.mks。 一個用於構建所有子項目,一個用於 libpng 子項目。 root/jni/png/Android.mk 看起來像這樣:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := png
MODULE_PATH := $LOCAL_PATH
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_C_INCLUDES := $(wildcard $(LOCAL_PATH)/*.h)

LOCAL_INTERMEDIATE_TARGETS += junk
junk:
    echo $(LOCAL_SRC_FILES)

include $(BUILD_STATIC_LIBRARY)

這個構建設置似乎什么都不做(即從根文件夾運行 ndk-build 什么也不做,即使在 ndk-build clean 之后)。 詳細運行(ndk-build V=1)顯示一些 rm -f 調用(刪除不存在的文件夾),但與項目或子項目無關。

我對為什么這個構建腳本失敗很感興趣,但是這個過程應該是微不足道的,所以我確信它沒有什么特別有趣的。 我對如何開始自己攻擊構建錯誤更感興趣。 上面腳本中的 echo 調用永遠不會被命中——我不知道如何確定什么是值或為什么它會跳過子項目。 有沒有人找到一種方法來了解構建系統正在嘗試做什么?

我也想知道這些工具是否有文檔,或者它是否只是 NDK 文檔文件夾中的少數文本文件? 我一直在嘗試通過復制隨機的 Android.mk 來解決這個問題,我從谷歌搜索中發現,但似乎只記錄了簡單 NDK 示例中使用的少數命令,因此經驗實際上只是提出了新問題。

我建議擺脫 MODULE_PATH 並且不要嘗試使用通配符:我還沒有真正看到它的工作原理。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := png
LOCAL_SRC_FILES := pngget.c pngread.c pngrutil.c pngtrans.c pngwtran.c png.c pngmem.c pngrio.c pngset.c pngwio.c pngwutil.c pngerror.c pngpread.c pngrtran.c pngwrite.c
LOCAL_C_INCLUDES := png.h pngconf.h pngpriv.h

include $(BUILD_STATIC_LIBRARY)

此外,我還沒有完全破譯一些嚴重的路徑魔法:不知何故 Eclipse 做了正確的事情,但是讓它從命令行跳過正確的箍對我來說仍然是命中或錯過。

編輯:所以對弄清楚這一點有一定的興趣,因為我已經有一段時間沒有使用 NDK 了。 當我使用原始文件時它沒有編譯,但是當我將 png 源代碼放在目錄jni中然后使用這個 Android.mk 文件時:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := png
LOCAL_SRC_FILES := pngget.c pngread.c pngrutil.c pngtrans.c pngwtran.c png.c pngmem.c pngrio.c pngset.c pngwio.c pngwutil.c pngerror.c pngpread.c pngrtran.c pngwrite.c
LOCAL_C_INCLUDES := png.h pngconf.h pngpriv.h

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := png2
LOCAL_STATIC_LIBRARIES := png

include $(BUILD_SHARED_LIBRARY)

它在 obj/local/armeabi 文件夾中構建了 libpng.a 和 libpng2.so。 我猜如果沒有依賴關系,它根本不會構建 static 庫。

在過去的兩個小時里,我一直在用這個問題打敗自己,這篇文章幫助解決了這個問題。 與其添加一個虛擬依賴項,不如簡單地將 ndk-build(它只是對 make 的一個薄包裝器)調用為“ndk-build png”。

我發現當我按照編輯中的描述添加一個“虛擬”共享庫時,the.a(我在 obj/ 中找到,暗示它是一個內部細節)不包含我想要的任何 the.o 文件。

此外,the.so 重新編譯了為 static 庫構建的所有文件。 因此,the.a 為空是有道理的。

幫助我的是在我的 Application.mk 中添加一個 APP_MODULES 行,如無法使用 Android NDK R8 構建 static 庫中所述 無論如何,您可能想要一個 Application.mk,因為它包含對您的 static 庫很重要的其他設置,例如 APP_STL、APP_PLATFORM、APP_ABI 等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM