可能に見えますが、私のスクリプトは奇妙な結果を生成します:
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ファイルは奇数パスで検索されます。提案?
更新:建物環境が壊れています...オフィスでは問題ありませんでしたが、自宅ではLOCAL_PATH:= $(call my-dir)でLOCAL_PATHをプロジェクトディレクトリではなくNDKディレクトリに定義します。これは私の作成のためのバッチです:
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)
ここでかなり遅れていますが、誰かがこの質問を読んだ場合、壊れたパスの問題(jniからのファイルのndkを指す)を回避する1つの方法は、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
ここで、2番目のAndroid.mkには、jniフォルダーにあるサブフォルダーにone.cおよびtwo.cファイルがあります。
として何かをしようとしていることに注意してください
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があるソースコードを探すことになります。
したがって、jniのすべてのサブディレクトリでこの形式でLOCAL_PATH:= $(call my-dir)を使用し、include $(call all-subdir-makefiles)を使用しますjni自体に問題はないはずです。
これが誰かを助けることを願っています。
編集:この動作は、LOCAL_PATHに保存されているものがinclude $(CLEAR_VARS)によって削除されないために発生します。
ここに私がそれをする方法があります。
1つの注意点は、ほとんどのプラットフォームに依存しないため、ビルドディレクトリにC++ソースコードを配置しないことです。これは、LOCAL_PATHがプロジェクトディレクトリのサブディレクトリではなく、/ jni内のファイルが2つの.mkファイルのみであることを意味します。
とにかく、完全なトップレベルのAndroid.mkと、実際のプロジェクトに含まれているものの1つです。
トップレベル:
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))
私の承認者は次のようになります。
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
現在のモジュール変数のセットアップの後にafterが含まれていることに注意してください。これは、各インクルードがLOCAL_PATH変数を変更するため(実際には$(call my-dir)が返すものを変更するため)、インクルードを最後に実行する必要があるためです。
これにより、含まれるすべてのモジュールが自動的にコンパイルされ(またはcleanで呼び出された場合はcleanになり)、含まれるすべてのライブラリにリンクされます。
このセットアップは実際のプロジェクトでテストされており、正常に動作します。
ここからの回答: https://docs.google.com/document/d/1jDmWgVgorTY_njX68juH5vt0KY_FXWgxkxmi2v_W_a4/edit
あなたは正しい軌道に乗っています。これは、Android.mkファイルを別のAndroid.mkファイルに含める適切な方法です。実際にはAndroid makeシステムで必要です。注意すべきことは、変数をクリアする行が-after-次のような他のメイクファイル:
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)
また、次のような(設定したいメイクファイルの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
さらに質問がある場合はお知らせください。お役に立てれば! :)
ここで非常に遅い答えですが、私はこの問題を抱えていて、これらの解決策はどれも役に立ちませんでした。解決策は簡単であることがわかりました。詳細な ここ として、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
以下のコードをテストします。
# 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
結果を印刷します。
$ 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"