2011-04-27 42 views
7

我想建立一個靜態庫,使用最新的Android NDK(r5),我沒有任何運氣。我已經能夠毫無問題地構建和運行示例(例如HelloJni),但從「從頭開始」開始一個新項目已經是另一回事了。如何爲NDK靜態庫編寫/調試Android.mk?

對於這個實驗,我試圖構建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子項目。根/ 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,建立什麼也不做,甚至後NDK,建立清潔)。詳細運行(ndk-build V = 1)會顯示一些rm -f調用(刪除不存在的文件夾),但與項目或子項目無關。

我對這個構建腳本失敗的原因很感興趣,但這個過程應該是微不足道的,所以我確信它沒有什麼太有趣的地方。我對如何開始自己攻擊構建錯誤更感興趣。在上面的腳本中回聲調用從來沒有打 - 我不知道如何確定什麼值或爲什麼它跳過子項目。有沒有人找到一種方法來知道構建系統是試圖用來做什麼?

我也有興趣知道這些工具是否有文檔,或者它是否只是NDK文檔文件夾中的一小部分文本文件?我一直在試圖通過複製我從Google搜索中發現的隨機Android.mk的部分來解決這個問題,但是隻有簡單的NDK示例中使用的幾個命令似乎被記錄下來,所以這些經驗實際上只是提出了新的問題。

回答

9

我建議擺脫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) 

它內置了兩個libpng.a和libpng2。所以在obj/local/armeabi文件夾中。我猜測它不會建立一個靜態庫,如果沒有依賴。

+0

謝謝。我已經嘗試過,並沒有改變任何行爲(ndk-build仍然是一個無操作)。我也嘗試刪除LOCAL_C_INCLUDES,因爲我不知道爲什麼會被使用。沒有運氣。這聽起來像你在暗示我使用eclipse來生成這個mk文件?我不知道你可以這樣做。我可能能夠使用它而不是關於如何調試.mk文件的說明。你能指點我怎麼做的嗎? – Dave 2011-04-27 23:28:41

+0

奇怪:對不起,沒有工作。原始的參考文件是手工生成的,但由Eclipse構建,除非我記錯。我會實際嘗試自己構建它。有一點需要注意:如果你在Windows上這樣做,你必須確保你的路徑中沒有空格,不管怎麼樣,或者在十多年後,Cygwin STILL不能正確處理空格(不是視覺工作室ddk做了一個粉碎的工作,所以這可能只是Windows吸吮風)。 – Femi 2011-04-27 23:49:33

+0

我將嘗試報廢我的文件夾結構並逐字使用您的文件。但是關於如何調試這些.mk文件的原始問題仍然存在。 僅供參考,我在Mac上... – Dave 2011-04-27 23:55:44

1

在過去的兩個小時裏,我一直在爲這個問題而頭疼,這篇文章幫助解決了這個問題。與其添加虛擬依賴關係,不如簡單地調用ndk-build(這僅僅是一個簡單的封裝)作爲「ndk-build png」。

0

我發現當我在編輯中添加了一個「dummy」共享庫時,.a(我在obj /中發現,暗示它是一個內部細節)不包含任何.o文件我想了。

此外,.so重新編譯了所有可能爲靜態庫構建的文件。所以說.a是空的。

幫助我的是將APP_MODULES行添加到我的Application.mk中,如Cannot build static library with Android NDK R8中所述。無論如何,你可能需要一個Application.mk,因爲它包含了對你的靜態lib非常重要的其他設置,如APP_STL,APP_PLATFORM,APP_ABI等。

相關問題