我目前在使用NDK清单文件中的资源时遇到问题,我确信这是一个快速修复错误。在大型库中,项目和操作系统之间共享大量文件。因此,为了使文件与其他项目保持同步,并且每次更新时都不使用最新的API更新每个项目,需要使用相对路径引用一大堆本机头文件和源代码文件。 / p>
在Eclipse中,我单击并拖动文件中的文件(不复制它们,但使用相对路径),这是当前应用程序在项目中的本地文件夹结构中所需要的。
/projectFolder /jni /externalProjectFiles /src /include
在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中包含第一个标题时,它会输出错误“没有这样的文件或目录”。
#include "externalFile.h"
我采取的方法是否可能解决方案?
我是否必须在Android.mk文件中为文件提供相对路径?这将是一个麻烦,而不是引用引用文件的本地文件夹。
理论上,听起来好像我能够以这种方式通过NDK创建一个库。但是,也许我没有正确地设置项目。任何助手都会有所帮助; JNI倾向于偶尔抛弃我。
编辑:似乎Eclipse(这是一个令人惊叹的IDE)在它保留在项目设置中的链接文件的引用后面没有任何粘合剂。如果我将引用的文件拖到项目中,则没有物理文件放入这些文件夹来表示链接文件的存在。该信息显然只存储在项目设置中。这对Android.mk文件没有帮助。
这意味着任何脚本或makefile都没有任何关于应该包含哪些文件的引用。不幸的是,我将不得不从makefile本身单独引用文件夹和文件。我可能会将项目中的引用留作其他程序员的存在暗示。不幸的是我不能这样设计,但这是我迄今收到的结论。
答案 0 :(得分: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中选择“链接到文件”。由于这两个项目与我将要使用的所有文件具有相同的相对路径,因此这就像一个魅力,并使我免于查找和删除我需要的各个文件。
由于共享文件只是那些目录中所需要的零碎文件,因此无法通过使用通配符创建对源文件的单个文件夹引用。但是,我认为最终最好是为移动软件请求组织文件夹结构,以便我们确实可以只引用移动项目中需要的文件。
所以最后,我无法使用链接文件作为清单文件的引用。如果它适用于您,则用户1368342提到可以在清单文件中制作和使用操作系统级链接文件。但是,出于多个操作系统平台的可移植性原因,我决定不采用这种方式。
至少通过这种方式设置,用户可以看到正在构建的项目库中包含的链接文件。当文件发生变化并得到更新时,他们还可以在屏幕和清单中获得更新,以及处理从项目中直接编译所产生的任何错误的能力。
缺点是当需要引入新文件时,需要将其添加到项目和清单中,而不是添加到单个位置。但是,这对我来说是一个可以接受的解决方案。希望遇到此问题的其他任何人都认为该方法很有用。
答案 1 :(得分:1)
如评论中所述,我也曾遇到Eclipse引用问题。我在操作系统级别使用了符号链接。
如果您使用符号链接对项目进行版本化可能会出现问题(但我相信它仍然值得尝试)。在我的例子中,我有一个版本化的主项目(并包含所有物理文件),并且符号链接用于编译不是的库。