Android的NDK:如何将Android.mk到另一个Android.mk(分层项目结构)?如何将、结构、项目、Android

2023-09-03 20:48:19 作者:偏执。

看起来这是可能的,但我的脚本会产生奇怪的结果:

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)

包括$(LOCAL_PATH)/libos/Android.mk
包括$(LOCAL_PATH)/libbase/Android.mk
包括$(LOCAL_PATH)/utils/Android.mk

LOCAL_MODULE:=本地
包括$(BUILD_SHARED_LIBRARY)
 

只有第一个包括被解析正常,其他Android.mk文件被seacrhed在奇数路径。 建议?

更新:我已经打破了我的建筑环境......这是在办公室确定,但在家里LOCAL_PATH:= $(叫我-DIR)定义了项目目录的LOCAL_PATH到NDK目录,而不是。这是我批的建设:

 设置BASHPATH = K:\ cygwin的\斌\庆典
设置PROJECTDIR = / cygdrive / H /亚历/亚历/工作/安卓/遥控机器人
设置NDKDIR = / cygdrive / H /亚历克斯/ Programming_Docs /安卓/ Android的NDK-R6 / NDK建造
设置APP_BUILD_SCRIPT = / cygdrive / H /亚历/亚历/工作/安卓/项目/ JNI / Android.mk
设置DEV_ROOT = H:/亚历/亚历/工作/安卓/项目

%BASHPATH%--login -cCD%PROJECTDIR%安培;&安培;%NDKDIR%
 

更新:我完全不明白怎么这东西组成的路径。我得到的错误中包含/cygdrive/d/project/jni//cygdrive/d/Soft/project/jni/libos/src/libos.cpp的路径。这是在我决定来指定根的所有文件Android.mk,而不是包括子模块。

更新2:没有运气,这也不行:

  LOCAL_PATH:= $(叫我-DIR)
#生成文件包含在这里。
包括$(LOCAL_PATH)/libos/Android.mk
包括$(LOCAL_PATH)/libbase/Android.mk
包括$(LOCAL_PATH)/utils/Android.mk

#清除变量在这里。
 包括$(CLEAR_VARS)
 
基于 Android NDK 的学习之旅 Android.mk 介绍

解决方案

pretty的晚了这里,但如果有人读了这个问题,让过去的破路径(指向NDK insted的问题的一种方式你从JNI)的文件在你的JNI文件夹:

 包括$(呼叫全子目录,生成文件)
 

,然后在它(libos,libbase和ustils在矿井的情况下OP)的每一个子目录这种形式的Andr​​oid.mk:

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_C_INCLUDES:= $(LOCAL_PATH)
LOCAL_MODULE:= utils的
LOCAL_SRC_FILES:= one.c
LOCAL_SRC_FILES + = two.c
 

,其中第二个Android.mk与在JNI文件夹中的子文件夹中one.c和two.c文件。

请注意,尝试一些为

  LOCAL_PATH_BIS_WEIRD_OTHER_NAME:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_C_INCLUDES:= $(LOCAL_PATH_BIS_WEIRD_OTHER_NAME)
LOCAL_MODULE:= utils的
LOCAL_SRC_FILES:= one.c
LOCAL_SRC_FILES + = two.c
 

将再次导致混淆编译器寻找信号源$ C ​​$ C,其中的NDK的。

所以,使用 LOCAL_PATH:= $(叫我-DIR)恰好这种形式的JNI的每一个子目录和包括$(呼叫全子目录,生成文件)在JNI本身,你不应该有问题。

希望这会帮助别人。

编辑:这种行为是因为什么被保存在LOCAL_PATH不会被删除由包括$(CLEAR_VARS)

Looks like it's possible, but my script produces odd results:

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)

Only the first include is being parsed fine, other Android.mk files are being seacrhed at odd paths. Suggestions?

Update: I have broken my building environment... It was OK in the office, but at home LOCAL_PATH:= $(call my-dir) defines LOCAL_PATH to NDK dir instead of project dir. This is my batch for building:

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%"

Update: I absolutely don't understand how does this thing compose paths. I'm getting errors with paths like "/cygdrive/d/project/jni//cygdrive/d/Soft/project/jni/libos/src/libos.cpp'. This is after I decided to specify all files in the root Android.mk instead of including submodules.

Update 2: No luck, this doesn't work either:

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)

解决方案

Pretty late here, but in case somebody reads this question, one way to get past the problem of broken paths(pointing to the ndk insted of your files from the jni) is to have in your jni folder:

include $(call all-subdir-makefiles)

and then in every subfolder of it (libos, libbase and ustils inthe case of OP) an Android.mk of this form:

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

where this second Android.mk in with the one.c and two.c files in a subfolder found in the jni folder.

Note that trying something as

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

will lead again to a confused compiler looking for your source code where the ndk is.

So, use the LOCAL_PATH := $(call my-dir) EXACTLY in this form in every subdirectory of the jni and include $(call all-subdir-makefiles) in the jni itself and you shouldn't have problems.

Hope this will help someone.

Edit: this behaviour happens because what is kept in LOCAL_PATH is not deleted by include $(CLEAR_VARS).