2011-08-04 12 views
20

ऐसा लगता है कि यह संभव है, लेकिन मेरी स्क्रिप्ट अजीब परिणाम का उत्पादन:एंड्रॉइड एनडीके: एंड्रॉइड.एमके को किसी अन्य एंड्रॉइड.एमके (पदानुक्रमित परियोजना संरचना) में कैसे शामिल करें?

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

include $(LOCAL_PATH)/libos/Android.mk 
include $(LOCAL_PATH)/libbase/Android.mk 
include $(LOCAL_PATH)/utils/Android.mk 

LOCAL_MODULE := native 
include $(BUILD_SHARED_LIBRARY) 

केवल पहले शामिल पार्स किया जा रहा है ठीक है, अन्य Android.mk फ़ाइलों अजीब रास्तों पर seacrhed जा रहा है। सुझाव?

अद्यतन: मैं अपने निर्माण पर्यावरण हड्डी टूट गई है ... यह कार्यालय में ठीक था, लेकिन घर LOCAL_PATH पर: = $ (मेरी-निर्देशिका कहते हैं) NDK निर्देशिका के बजाय परियोजना dir को LOCAL_PATH परिभाषित करता है।

set BASHPATH=K:\cygwin\bin\bash 
set PROJECTDIR=/cygdrive/h/Alex/Alex/Work/Android/remote-android 
set NDKDIR=/cygdrive/h/Alex/Programming_Docs/Android/android-ndk-r6/ndk-build 
set APP_BUILD_SCRIPT=/cygdrive/h/Alex/Alex/Work/Android/project/jni/Android.mk 
set DEV_ROOT=h:/Alex/Alex/Work/Android/project 

%BASHPATH% --login -c "cd %PROJECTDIR% && %NDKDIR%" 

अपडेट:: इस इमारत के लिए मेरे बैच है मैं बिल्कुल समझ में नहीं आता कि कैसे इस बात रास्तों रचना करता है। मुझे "/cygdrive/d/project/jni//cygdrive/d/Soft/project/jni/libos/src/libos.cpp 'जैसे पथों के साथ त्रुटियां मिल रही हैं। यह रूट के सभी फ़ाइलों को निर्दिष्ट करने का निर्णय लेने के बाद है Android.mk बजाय 2 submodules सहित

अद्यतन:। कोई भाग्य, यह काम नहीं करता है या तो:

LOCAL_PATH:= $(call my-dir) 
# Include makefiles here. 
include $(LOCAL_PATH)/libos/Android.mk 
include $(LOCAL_PATH)/libbase/Android.mk 
include $(LOCAL_PATH)/utils/Android.mk 

# Clear variables here. 
include $(CLEAR_VARS) 
+2

मैं एक अंग पर बाहर जाना और सुझाव है कि हो सकता है पहले 'Android.mk' को पुनर्परिभाषित कर रहा है' होगी:

# I want only second-level mk files, that is the direct sub-directories # in the current path. include $(wildcard */*/Android.mk) # include $(call all-subdir-makefiles) ## $(wildcard $(call my-dir)/*/Android.mk) # include $(call all-makefiles-under,$(LOCAL_PATH)) 

Android.mk

# I dunno why it's an empty result for $(call all-subdir-makefiles). # $(info [^-^ print-test] all-subdir-makefiles = "$(call all-subdir-makefiles) ") $(info [print-test] assert "jni/Android.mk" = "$(wildcard */Android.mk)") # print: jni/Android.mk $(info [print-test] $$(wildcard */*/Android.mk) = "$(wildcard */*/Android.mk)") # print: jni/xxdir/Android.mk 

मैं परिणाम प्रिंट LOCAL_PATH'। कुछ अन्य परिवर्तनीय नामों का उपयोग करने का प्रयास करें, जैसे 'आर्डवर्क', और देखें कि क्या होता है। – Beta

उत्तर

19

सुंदर देर से यहाँ है, लेकिन इस मामले में किसी को इस सवाल पढ़ता है, एक तरह से टूटी हुई पथ (ओर इशारा करते हुए के लिए NDK JNI से अपनी फ़ाइलें के insted) की समस्या पिछले पाने के लिए अपने JNI फ़ोल्डर में है:

include $(call all-subdir-makefiles) 

और फिर इसे (Libos, libbase और ओ पी के मामले inthe ustils) एक Android के हर सबफ़ोल्डर में।इस फार्म के mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_C_INCLUDES  := $(LOCAL_PATH) 
LOCAL_MODULE   := utils 
LOCAL_SRC_FILES   := one.c 
LOCAL_SRC_FILES   += two.c 

जहां JNI फ़ोल्डर में मिलता एक सबफ़ोल्डर में one.c और two.c फाइलों के साथ में यह दूसरा Android.mk।

ध्यान दें कि

LOCAL_PATH_BIS_WEIRD_OTHER_NAME := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_C_INCLUDES  := $(LOCAL_PATH_OTHER_FUNKY_NAME) 
LOCAL_MODULE   := utils 
LOCAL_SRC_FILES   := one.c 
LOCAL_SRC_FILES   += two.c 

के रूप में कुछ की कोशिश कर अपने स्रोत कोड की तलाश में जहां NDK है एक उलझन संकलक करने के लिए फिर से नेतृत्व करेंगे।

तो, का उपयोग LOCAL_PATH: = $ (मेरी-निर्देशिका कहते हैं) बिल्कुल JNI के हर उपनिर्देशिका में इस रूप में और $ शामिल ही JNI में (सभी subdir-makefiles कहते हैं) और आप shouldn समस्या नहीं है।

आशा है कि यह किसी की मदद करेगा।

संपादित करें: यह व्यवहार होता है क्योंकि LOCAL_PATH में जो रखा जाता है उसे $ (CLEAR_VARS) शामिल नहीं किया जाता है।

+0

लाइफसेवर! जब तक मैं इस समाधान का उपयोग नहीं करता तब तक मेरे सभी पथ और सामान को गड़बड़ कर दो ... मैं हमेशा इस तरह के quirks के कारण एनडीके बिल्ड सिस्टम के साथ काम करने से डरता हूं। –

6

आप सही रास्ते पर हैं यही कारण है कि उचित तरीके से एंड्रॉयड शामिल करने के लिए है। .mk फ़ाइलों को किसी अन्य के भीतर - वास्तव में यह एंड्रॉइड बनाने की प्रणाली द्वारा आवश्यक है। ध्यान देने योग्य एक बात यह है कि चर को साफ़ करने की रेखा दिखाई देनी चाहिए- इसके बाद- आप अन्य मेकफ़ाइल शामिल करते हैं, जैसे:

LOCAL_PATH:= $(call my-dir) 

# Include makefiles here. 
include $(LOCAL_PATH)/libos/Android.mk 
include $(LOCAL_PATH)/libbase/Android.mk 
include $(LOCAL_PATH)/utils/Android.mk 

# Clear variables here. 
include $(CLEAR_VARS) 

# Final settings. 
LOCAL_MODULE := native 
include $(BUILD_SHARED_LIBRARY) 

मैं भी वहाँ अन्य महत्वपूर्ण झंडे आप या स्थापित करने के लिए नहीं चाहते हो सकता है हो सकता है, निम्नलिखित (एक मेरी makefiles में से एक से उदाहरण) सहित है कि उल्लेख चाहते हैं:

# Settings. 
LOCAL_C_INCLUDES    := $(MY_INCLUDES) 
LOCAL_STATIC_LIBRARIES  := $(MY_MODULES) 
LOCAL_WHOLE_STATIC_LIBRARIES := $(MY_WHOLE_MODULES) 
LOCAL_LDLIBS     := -lz -llog -lGLESv1_CM -lGLESv2 
LOCAL_ARM_MODE    := arm 
LOCAL_MODULE     := game 

अंत में, मैं मिल गया है विशेष रूप से सहायक होने के लिए एंड्रॉइड एनडीके के भीतर एम्बेडेड दस्तावेज। मेरा निम्नलिखित स्थान में पाया जाता है:

android-ndk-r6/documentation.html 

यदि आपके पास और प्रश्न हैं तो मुझे बताएं। उम्मीद है की यह मदद करेगा! :)

+0

साथ ही, क्या मुझे प्रत्येक icluded .mk में या केवल एक बार शीर्ष-स्तर में LOCAL_ARM_MODE: = arm जैसी चीज़ों को निर्दिष्ट करने की आवश्यकता है? –

+4

CLEAR_VARS "LOCAL_PATH" के अपवाद के साथ मेकफ़ाइल में सभी "LOCAL_" चर साफ़ करता है। साथ ही, सभी सेटिंग्स स्थानीय हैं (इसलिए नाम में "LOCAL_") ताकि वे केवल उस मेकफ़ाइल पर लागू हों, जिससे आपको उन्हें हर जगह रखना होगा। अंत में, प्रलेखन में, application.mk फ़ाइल देखें - इसका उपयोग सभी मेकफ़ाइल पर लागू ध्वज निर्दिष्ट करने के लिए किया जा सकता है। :) –

+0

समझा, धन्यवाद। तो, शामिल है।mk शीर्ष-स्तर .mk के LOCAL_PATH को फिर से परिभाषित नहीं कर सकता है? या इसमें शामिल है ताकि यह एक स्टैंडअलोन इकाई न हो बल्कि शीर्ष-स्तरीय फ़ाइल का हिस्सा हो? –

14

यहां मैं यह कैसे करता हूं।

एक चेतावनी यह है कि मैं बिल्ड डीआईआर में अपना कोई सी ++ स्रोत कोड नहीं डालता, क्योंकि इसमें से अधिकांश मंच-स्वतंत्र है। इसका मतलब यह है कि LOCAL_PATH प्रोजेक्ट डीआईआर का सबडिर नहीं है, और/jni में केवल फाइलें 2 .mk फ़ाइलें हैं।

शीर्ष स्तर:

LOCAL_PATH := $(abspath $(call my-dir)/../../../src) 

# utility to create paths for included makefiles 
local-rel-path = $(patsubst /%,%,$(subst $(LOCAL_PATH),,$(abspath $1))) 

include $(CLEAR_VARS) 

LOCAL_MODULE := NativeApp 

LOCAL_LDLIBS := -lGLESv1_CM 

# As opposed to "thumb" 
LOCAL_ARM_MODE := arm 

LOCAL_SRC_FILES := 

# 
# includes 
# 
# Note that LOCAL_C_INCLUDE is relative to thr NDK root, unlike source paths 
# (or you can just make 'em absolute) 
# 
STL_INC_DIR = /cygdrive/c/STLport-5.2.1/stlport 

MY_LOCAL_C_INCLUDES := core satcalc bruce/bruce/inc bruce/gfx/inc bruce/ui/inc bruce/unzip bruce/libpng 

LOCAL_C_INCLUDES := $(addprefix $(LOCAL_PATH)/,$(MY_LOCAL_C_INCLUDES)) $(STL_INC_DIR) 

ifeq ($(APP_OPTIM),debug) 
# debug 
LOCAL_CFLAGS = -DPLATFORM_ANDROID -D_DEBUG -fvisibility=hidden 
else 
#release 
LOCAL_CFLAGS = -DPLATFORM_ANDROID -fvisibility=hidden 
endif 

LOCAL_STATIC_LIBRARIES := 

# 
# Code 
# 
include $(LOCAL_PATH)/core/Android.mk 
include $(LOCAL_PATH)/satcalc/Android.mk 
include $(LOCAL_PATH)/bruce/bruce/src/Android.mk 
include $(LOCAL_PATH)/bruce/gfx/src/Android.mk 
include $(LOCAL_PATH)/bruce/ui/src/Android.mk 
include $(LOCAL_PATH)/bruce/unzip/Android.mk 
include $(LOCAL_PATH)/bruce/libpng/Android.mk 

# 
# Build it 
# 
include $(BUILD_SHARED_LIBRARY) 

... और एक शामिल Android.mk

वैसे भी, यहाँ एक पूर्ण उच्च-स्तरीय Android.mk और एक वास्तविक परियोजना के लिए शामिल किए गए लोगों में से एक है:

MY_PATH = $(call my-dir) 

MY_LOCAL = $(call local-rel-path, $(MY_PATH)) 

MY_SRC_FILES = Font.cpp Gfx2d_ogles.cpp SgaState.cpp \ 
     Sprite.cpp TImage.cpp TImageOgles.cpp 

LOCAL_SRC_FILES += $(addprefix $(MY_LOCAL)/,$(MY_SRC_FILES)) 
9

मेरे approah इस तरह है:

LOCAL_PATH:= $(call my-dir) 

# Clear variables here. 
include $(CLEAR_VARS) 

# Current module settings. 
LOCAL_MODULE := native 
# setup some source files 
LOCAL_SRC_FILES := file1.c file2.c 
# setup some includes 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libos/include 
# setup the included libs for the main module 
LOCAL_STATIC_LIBRARIES := libos libbase utils # note that order matters here 

include $(BUILD_SHARED_LIBRARY) 

# Include makefiles here. Its important that these 
# includes are done after the main module, explanation below. 

# create a temp variable with the current path, because it 
# changes after each include 
ZPATH := $(LOCAL_PATH) 

include $(ZPATH)/libos/Android.mk 
include $(ZPATH)/libbase/Android.mk 
include $(ZPATH)/utils/Android.mk 

ध्यान दें, कि वर्तमान मॉड्यूल चर के सेटअप के बाद किया जाता है शामिल हैं। इसकी आवश्यकता है क्योंकि प्रत्येक में LOCAL_PATH चर को संशोधित करना शामिल है (वास्तव में यह $ $ (कॉल-माय-डीआईआर) रिटर्न संशोधित करता है) और यही कारण है कि आखिरी बार क्यों किया जाना चाहिए।

यह स्वचालित रूप से सभी शामिल मॉड्यूल को संकलित करेगा (या साफ़ होने पर साफ करें) और फिर सभी शामिल पुस्तकालयों से लिंक करें।

यह सेटअप एक वास्तविक परियोजना में परीक्षण किया गया था और सही तरीके से काम करता है।

जवाब यहाँ से लिया: https://docs.google.com/document/d/1jDmWgVgorTY_njX68juH5vt0KY_FXWgxkxmi2v_W_a4/edit

+1

ZPATH एक आकर्षण की तरह काम कर रहा है, धन्यवाद! –

3

बहुत देर से इस सवाल का जवाब यहाँ है, लेकिन मैं इस समस्या थी और इन समाधानों में से कोई भी उपयोगी नहीं थे। समाधान पता चला है सीधा होने के लिए: के रूप में विस्तृत here, एक MY_LOCAL_PATH चर सेट और LOCAL_PATH हर बार पुनः निर्दिष्ट करें:

MY_LOCAL_PATH := $(call my-dir) 

LOCAL_PATH := $(MY_LOCAL_PATH) 

... declare one module 

include $(LOCAL_PATH)/foo/Android.mk 

LOCAL_PATH := $(MY_LOCAL_PATH) 

... declare another module 
0

मैं नीचे दिए गए कोड ठीक परीक्षण करें।

$ cd your_project_path 
$ ndk-build 
[print-test] assert "jni/Android.mk" = "jni/Android.mk" 
[print-test] (wildcard */*/Android.mk) = "jni/HelloWorld/Android.mk jni/MessagePack/Android.mk" 
संबंधित मुद्दे