1

我已经阅读了所有的 Android.mk 介绍,并在这个论坛上查看了一些关于它的帖子。而且仍然不确定如何将其应用于我正在尝试做的事情。我只是想访问本机库文件,其中一些位于我的 JNI 目录下的几个级别。我所做的是在我的 JNI 目录中放置一个符号链接到我的源,称为 tbd,并将以下行放入我的 Android.mk

LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)
include $(CLEAR_VARS)
LOCAL_MODULE    := HelloJNI 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/tbd
LOCAL_SRC_FILES := HelloJNI.c  manifest.c 
LOCAL_STATIC_LIBRARIES := \
libtbd_service \
libtbd_common \
libc

我不知道如何查看 tbd 目录中的某些文件。我正在尝试在 libc direcoty 中的文件中调用一个函数,该文件位于我的 jni 文件夹下的几个级别,我收到消息“找不到文件”。我看到一个帖子,其中有人提出以下建议:

FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/**/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/**/**/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

这是否意味着我必须为/tbd中的每个目录执行此操作?必须有一种更有效的方法来做到这一点。

别人建议...

LOCAL_SRC_FILES += $(patsubst $(LOCAL_PATH)/%, %, $(wildcard folder/**/*.cpp))

我什至无法理解这一点:-( % 在这一行中做了什么?有人能解释一下这个命令在做什么吗?

@alijandro; 谢谢。所以我只需要找出我有多少级别的目录结构。嘿,您知道静态库或共享库吗?Android.mk 文档说“BUILD_SHARED_LIBRARY 是构建系统提供的一个变量,它指向一个 GNU Makefile 脚本,该脚本负责收集你在 LOCAL_XXX 变量中定义的所有信息,因为最新的‘include $(CLEAR_VARS)’并确定什么构建,以及如何准确地做到这一点。”所以我不知道它会如何做这一切或它意味着什么的细节。它可能会对提到的源文件进行递归搜索吗?

4

1 回答 1

1
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/**/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/**/**/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

上面的语句将在最多三个子目录中获得 .cpp 文件的列表。它使用 makefile 内置函数进行文件名操作wildcard

LOCAL_SRC_FILES += $(patsubst $(LOCAL_PATH)/%, %, $(wildcard folder/**/*.cpp))

同样,上面的语句使用内置函数模式替换$(patsubst pattern,replacement,text),这意味着找到patternintext并将它们替换为replacement。该模式%表示 makefile 中的任何字符。

您可以参考此处了解有关 makefile 的更多信息。

于 2015-03-12T08:40:04.390 回答