Android NDK: 如何让gcc使用额外的包含目录

21

这是一个简单的问题(我正在使用带有cygwin的android NDK r6,但这是关于makefiles和gcc的问题)。假设我在jni/目录下放置了一个名为mylib_v_1/的目录下的库。Mylib的结构如下:

mylib_v_1
   mylib
      include

在include目录下有两个文件,myinc1.hpp和myinc2.hpp。在myinc1.hpp中有一行代码:

#include <mylib/myinc2.hpp>

在我的.cpp文件中,位于jni/目录下,有以下这行代码:

#include <mylib/myinc1.hpp>
我想设置Android.mk文件(或其他需要设置的文件),以便让gcc知道使用jni/mylib_v_1/作为附加的include目录,从而可以使用用尖括号括起来的#include(在我的实际情况中不止两个文件,有很多.hpp文件都使用了尖括号符号引用了很多其他的.hpp文件)。
我该怎么做呢?
谢谢。
附注: 如果在.cpp文件中我改变了这样的包含方式:
#include "mylib/myinc1.hpp"

gcc可以找到myinc1.hpp文件,但在处理该文件时,它发现了第二个include:

#include  <mylib/myinc2.hpp>

然后停在那里,说它无法找到名为myinc2.hpp的文件。

2个回答

26

选项1:

在你选择的一个模块内的Android.mk里添加下列其中一行:

   LOCAL_C_INCLUDES := /path/to/your/includes # ignore previous includes
                                              # OR
   LOCAL_C_INCLUDES += /path/to/your/includes # preserve previous includes

如果必要的话,您可以创建一个指向“/path/to/your/includes”的环境变量,并像这样进行包含:

   LOCAL_C_INCLUDES := $(MYLIB_INCLUDES_PATH) # ignore previous includes
                                              # OR
   LOCAL_C_INCLUDES += $(MYLIB_INCLUDES_PATH) # preserve previous includes

选项2:

  1. 将包含所有头文件的完整文件夹(mylib)复制到您项目中的“jni”文件夹中。

  2. 在您选择的模块中的 Android.mk 中添加以下行:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/mylib
或者
LOCAL_C_INCLUDES += $(LOCAL_PATH)/mylib

根据之前是否有包含文件而定。

选项3:

安装Eclipse的CDT插件,并将'mylib'目录的绝对路径添加到项目的包含路径中。这是一个很好的教程,展示了所有必要的步骤。

http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/


1
除非我在每个C包含文件的开头加上-I,例如_I/path/to/your/includes_或_I"/path/to/your/includes"_,否则选项1和2对我无效。 - leetNightshade
只在“LOCAL_C_INCLUDES +=”中使用绝对路径对于CDT情况对我有效,尽管ndk-build没有这样的限制。 - Yingpei Zeng

3

您可以使用以下方法在Android.mk中添加C包含路径:

common_CFLAGS := -Ijni/mylib/include

任何额外的路径都需要添加另一个-I选项。


无法使其工作。它仍然显示找不到mylib/myinc1.hpp。我已经添加了common_CFLAGS += $(LOCAL_PATH)/mylib,因为LOCAL_PATH应该是jni目录。 - Luke
从你的评论中看来,你忘记在路径前加上-I了。 - Burton Samograd
我已尝试了所有可能的组合。无事可做。真的很尴尬...然而,该项目位于d:/android/workspace/helloworld下。在helloworld下有jni目录,在其中有.cpp和.mk文件。使用cygwin,我必须准确进入helloworld/jni目录并键入:/cygdrive/d/android/android-ndk-r6/ndk-build NDK_LOG=1。希望这能帮助你们来帮助我!! - Luke
2
好的,我在这里学习东西。首先,我启动了NDK_BUILD V=1。这将强制构建过程显示gcc如何调用。我尝试使用common_FLAGS和LOCAL_C_INCLUDES,但没有成功(事实上,没有-I cmd线选项显示/mylib =>这是真正的问题)。从文档中我学到了另一种包含东西的方法:现在我使用LOCAL_C_INCLUDES := $(NDK_APP_PROJECT_PATH)/jni/mylib。它立即有效。但建议使用LOCAL_C_INCLUDES。该死... - Luke
谢谢Luke,你的代码起作用了...我也遇到了同样的问题...坐了一小时解决这个问题...哎呀 - Houston
我不得不在我的包含文件周围加上双引号,因为我的路径名中有空格。 - Randall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接