2012-01-23 14 views
46

मैं एनडीके का उपयोग करके एक एंड्रॉइड प्रोजेक्ट बनाने की कोशिश कर रहा हूं, लेकिन मैंने कुछ परेशानियों में भाग लिया है।एंड्रॉइड.एमके, सभी सीपीपी फाइलों को शामिल करें

यहाँ Android.mk फ़ाइल है कि काम करता है:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := mylib 
LOCAL_CFLAGS := -Werror 
LOCAL_SRC_FILES := main.cpp, Screen.cpp, ScreenManager.cpp 
LOCAL_LDLIBS := -llog 

include $(BUILD_SHARED_LIBRARY) 

वहाँ एक तरीका है कि LOCAL_SRC_FILES के तहत उन्हें मैन्युअल रूप से लिस्टिंग के बिना, मुझे निर्देशिका में सभी * सीपीपी फ़ाइलों को निर्दिष्ट करने की अनुमति देता है है?

अब तक मैंने LOCAL_SRC_FILES = $ (वाइल्डकार्ड * .cpp) का उपयोग करने का प्रयास किया है, लेकिन अब यह काम करता है, ऐसा लगता है कि कोई भी फाइल नहीं चुनी जाती है।

उत्तर

71

आप कुछ इस तरह की कोशिश कर सकते ...

FILE_LIST := $(wildcard $(LOCAL_PATH)/[DIRECTORY]/*.cpp) 
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 

... फ़ाइलों की वास्तविक निर्देशिका के लिए [DIRECTORY] बदलें। यदि वे आपकी .mk फ़ाइल के समान निर्देशिका में हैं तो उस भाग को हटा दें। [DIRECTORY] निर्देशिका के तहत .cpp फ़ाइलों को खोजने के लिए FILE_LIST चर बनाएँ। फिर फ़ाइल लिस्टिंग में इसका इस्तेमाल करें। LOCAL_SRC_FILES लाइन तब लिस्टिंग से LOCAL_PATH हटा देगा।

+0

धन्यवाद, यह काम किया! – gq3

+1

@DiscGolfer आप लिस्टिंग से 'LOCAL_PATH' क्यों हटाते हैं? – Narek

+1

@Narek आपको अपने 'Android.mk' के शीर्ष पर' LOCAL_PATH: = $ (my-dir कॉल करें) को परिभाषित करना होगा। यह आपके एनडीके रूट से संबंधित फ़ाइल तक सापेक्ष पथ रखता है। इसलिए, ऊपर 'LOCAL_SRC_FILES' पंक्ति में, मैंने लिस्टिंग से 'LOCAL_PATH' हटा दिया क्योंकि फ़ाइल पथ' LOCAL_PATH' के सापेक्ष हैं। यदि हटाया नहीं जाता है तो पथ अमान्य कर देगा। – DRiFTy

20

मैं अपने एंड्रॉइड.एमके के लिए इस स्क्रिप्ट का उपयोग कर रहा हूं मुझे इतना समय बचा है!

#traverse all the directory and subdirectory 
define walk 
    $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e))) 
endef 

#find all the file recursively under jni/ 
ALLFILES = $(call walk, $(LOCAL_PATH)) 
FILE_LIST := $(filter %.cpp, $(ALLFILES)) 

LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 

Here सार

+0

इसका उपयोग करने के लिए, सुनिश्चित करें कि यह परिभाषा आपके मेकफ़ाइल _before_ में उपयोग की जाने वाली किसी भी कोड में रखी गई है, अन्यथा इसे कॉल करने में चुपचाप विफल हो जाएगा। –

+0

सिर्फ एक नोट, यह सही समाधान है –

+0

FILE_LIST से पथ को कैसे बाहर निकालें? और जब मैं LOCAL_SRC_FILES को FILE_LIST असाइन करता हूं तो $ (FILE_LIST: $ (LOCAL_PATH) /% =%) क्यों नहीं लिखता है, केवल $ (FILE_LIST)? –

2

है कैसे के बारे में इस तरह:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/*.cpp)) 

यदि आप डर होगा कि * के विस्तार में शामिल है $ (LOCAL_PATH) /, यह ठीक हो सकता है:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/./,,$(wildcard $(LOCAL_PATH)/./*.cpp)) 
संबंधित मुद्दे