2011-08-04 13 views
20

それが可能だように見えますが、私のスクリプトが奇数の結果生成:Android NDK:Android.mkを別のAndroid.mk(階層的なプロジェクト構造)に組み込む方法

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されている、細かい解析されています。 提案?

アップデート:= $は(私の-DIRを呼び出す)NDKのディレクトリの代わりに、プロジェクトのディレクトリにLOCAL_PATHを定義します。私は...それはオフィスでOKだったが、ホーム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:ませ運ん、これはどちらか動作しません:

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

をLOCAL_PATH'。 'AARDVARK'のような他の変数名を使ってみて、何が起こるか見てみましょう。 – Beta

答えて

19

が、誰かがこの質問を読み込む場合には、(NDKを指すJNIからファイルのinsted)壊れたパスの問題を乗り越えるための一つの方法は、あなたのJNIのフォルダを持っていることです。

include $(call all-subdir-makefiles) 

そして、それのすべてのサブフォルダ(OPの場合はlibos、libbase、および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のすべてのサブディレクトリで、まさにこの形で$(私の-DIRを呼び出す)=は、JNI自体に$(全サブディレクトリ-makefileを呼び出す)が含まれており、あなたはするべきでありません問題があります。

これは誰かを助けることを願っています。

編集:この現象は、LOCAL_PATHに保存されているものがinclude $(CLEAR_VARS)によって削除されないために発生します。含まれるが現在のモジュール変数の設定後を行っている

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 

注:

+0

ライフセーバー!この解決法を使うまで私の道を詰まらせてしまいました...このような癖のためNDKビルドシステムではいつも恐れています。 –

6

あなたは正しい軌道に乗っていることは、Androidを含めるための適切な方法です。 .makeファイルは実際にはAndroid makeシステムで必要とされていますが、注意しておきたいのは、変数をクリアする行が次のように表示されるということです:

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) 

私はまた、次の(私のmakefileの1の例)を含め、または設定したくない場合があり、他の重要なフラグ、があることを言及したい:最後に

# 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に組み込まれたドキュメントが特に役立ちます。鉱山は次の場所にあります:

android-ndk-r6/documentation.html 

質問がありましたら教えてください。お役に立てれば! :)

+0

また、LOCAL_ARM_MODE:= arm のようなものをすべてのicluded .mkに指定する必要がありますか、トップレベルに1回だけ指定する必要がありますか? –

+4

CLEAR_VARSは、 "LOCAL_PATH"を除いて、メークファイル内の "LOCAL_"変数をすべてクリアします。また、すべての設定はローカル(つまり、名前の "LOCAL_")なので、設定されているメイクファイルにのみ適用されるため、どこにでも置く必要があります。最後に、ドキュメントでは、Application.mkファイルをチェックアウトします。これは、すべてのメイクファイルに適用されるフラグを指定するために使用できます。 :) –

+0

ご理解、ありがとうございます。したがって、含まれています。mkは最上位の.mkのLOCAL_PATHを再定義できませんか?それとも、スタンドアロンのエンティティではなくトップレベルのファイルの一部になるように含まれていますか? –

14

ここで私はそれを行う方法です。

1つの注意点は、ビルドディレクトリにC++ソースコードを入れないことです。そのほとんどはプラットフォームに依存しないためです。これは、LOCAL_PATHがプロジェクトディレクトリのサブディレクトリではなく、/ jniの唯一のファイルが2つの.mkファイルであることを意味します。

とにかく、ここでは完全なトップレベルAndroid.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:

かなり遅く、ここ
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)が返すものを変更します)。なぜincludeが最後に行われなければならないのでしょうか?

これにより、すべてのモジュールが自動的にコンパイルされます(またはクリーンで呼び出された場合はクリーンアップされます)。その後、すべてのライブラリにリンクされます。

このセットアップは実際のプロジェクトでテストされ、正しく動作します。ここから取ら

答え: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

私は大丈夫以下のコードをテストします。

# 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 

私は結果の印刷:私は手足に出て行って、多分最初は `Android.mk`が`再定義されることを示唆しているでしょう

$ 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" 
関連する問題