从Android NDK清单文件引用相对路径资源

时间:2013-03-26 19:27:44

标签: android eclipse android-ndk java-native-interface android-manifest

我目前在使用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本身单独引用文件夹和文件。我可能会将项目中的引用留作其他程序员的存在暗示。不幸的是我不能这样设计,但这是我迄今收到的结论。

2 个答案:

答案 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引用问题。我在操作系统级别使用了符号链接。

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