3

我目前在包含 NDK 清单文件中的资源时遇到问题,我确信这是一个快速修复错误。大型库中的项目和操作系统之间共享大量文件。因此,为了使文件与其他项目保持同步,并避免在每次更新时使用最新的 API 更新每个单独的项目,需要使用相对路径引用一大堆本机头文件和源代码文件。

在 Eclipse 中,我在项目的本地文件夹结构中单击并拖动了当前应用程序所需的文件(不复制它们,而是使用相对路径)。

/项目文件夹 /jni /外部项目文件 /src /包括

使用 Eclipse 中的这个文件夹结构,我有一个具有以下结构的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := projectLib

LIBRARY_SRC_FOLDER   := $(wildcard $(LOCAL_PATH)/externalProjectFiles/src/*.cpp)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/externalProjectFiles/include

LOCAL_SRC_FILES :=  projectLibNDK.c
LOCAL_SRC_FILES +=  $(LIBRARY_SRC_FOLDER:$(LOCAL_PATH)/%=%)

LOCAL_LDLIBS    := -L$(SYSROOT)/usr/lib -llog -landroid
LOCAL_CFLAGS    :=  -Wno-multichar -D_ANDROID -DLIBDIR="\"c\"" 
LOCAL_CFLAGS    +=  -DUSE_TCP_LOOPBACK -DMDNS_UDS_SERVERPATH=\"/var/run/mdnsd\" -DIN_LIBRARY -DBUILDING_LIBICONV -DUSE_BONJOUR 
LOCAL_CFLAGS    +=  -DXR_TARGET_ANDROID -DKS_BUILDING_KS -Wno-psabi -Wno-multichar -D_GNU_SOURCE -DHAVE_IPV6=0 -DNOT_HAVE_SA_LEN 
LOCAL_CFLAGS    +=  -DUSES_NETLINK -DHAVE_LINUX -DTARGET_OS_LINUX
LOCAL_CPPFLAGS  :=  -frtti -fexceptions

include $(BUILD_SHARED_LIBRARY)

但是,当我尝试在 projectLibNDC.c 中包含第一个标头时,它会打印错误"No such file or directory"

#include "externalFile.h"

我正在采取的方法是可能的解决方案吗?
我是否必须在 Android.mk 文件本身中为这些文件提供相对路径?这比引用引用文件的本地文件夹更麻烦。

从理论上讲,听起来好像我可以通过这种方式通过 NDK 创建一个库。但是,也许我没有正确设置项目。任何助手都会有所帮助;JNI 有时会惹恼我。

编辑: 似乎 Eclipse(这是一个了不起的 IDE)在其项目设置中保存的链接文件的引用后面没有任何胶水。如果我将引用的文件拖到项目中,则没有物理文件放入这些文件夹以表示链接文件的存在。该信息显然仅存储在项目设置中。这对 Android.mk 文件没有帮助。

这意味着任何脚本或 makefile 都没有关于应该包含哪些文件的任何参考。不幸的是,我将不得不从 makefile 本身单独引用文件夹和文件。我可能会将项目中的引用作为其他程序员对其存在的暗示。不幸的是我不能那样设计它,但这是我迄今为止得到的结论。

4

2 回答 2

2

最后,我决定采用的方法是将文件的相对路径分别包含在 makefile 中。这不是最干净的解决方案,但它确实有效,并为以后的工作提供了一个体面的环境。

...
LOCAL_C_INCLUDES += $(COMMON_COMPUTATION_PATH)
LOCAL_C_INCLUDES += $(COMMON_DATASET_PATH)
...
LOCAL_SRC_FILES += $(COMMON_COMPUTATION_PATH)/matrixRT.cpp $(COMMON_COMPUTATION_PATH)/multiplRT.cpp
LOCAL_SRC_FILES += $(COMMON_COMPUTATION_PATH)/multiplSqRT.cpp $(COMMON_COMPUTATION_PATH)/multiplSq1978RT.cpp
...

从以前的库开始,该库已经在 iOS 应用程序中链接了文件,我可以将这些资源拖到 Eclipse 项目中的本地文件夹中。然后从 PROJ_LOC 中选择“链接到文件”。由于这两个项目对我将使用的所有文件都有相同的相对路径,这就像一个魅力,让我免于查找和丢弃我需要的单个文件。

由于共享文件只是这些目录中所需的零碎内容,因此我无法使用通配符创建对源文件的单个文件夹引用。但是,我相信最终最好为移动软件请求一个组织文件夹结构,以便我们确实可以只引用移动项目中需要的文件。

所以最后,我无法使用链接文件作为清单文件的参考。如果它对您有用,user1368342 已经提到可以从清单文件中制作和使用操作系统级别的链接文件。但是,出于跨多个操作系统平台的可移植性原因,我决定不走这条路。

至少通过这种设置,用户可以看到正在构建的项目库中包含的链接文件。当文件更改和更新时,他们还可以在屏幕和清单中获得更新,以及处理直接从项目内编译它产生的任何错误的能力。

缺点是当需要引入一个新文件时,它需要同时添加到项目和清单中,而不是在一个位置。但是,这对我来说是一个可以接受的解决方案。希望遇到诸如此类问题的其他任何人都发现该方法很有用。

于 2013-03-28T11:47:19.483 回答
1

正如评论中提到的,我曾经也遇到过 Eclipse 引用的问题。我改为在操作系统级别使用符号链接。

如果您使用符号链接对项目进行版本控制,可能会出现问题(但我相信它仍然值得尝试)。就我而言,我有一个已版本化的主项目(并包含所有物理文件),并且符号链接用于编译未版本化的库。

于 2013-03-27T14:18:23.170 回答