为什么在Android NDK代码中包含时,包含路径不可见?
我想为我的Android NDK项目添加一个包含路径,但编译器找不到包含的文件。我仔细检查了系统中是否存在包含的文件。我做错了什么 Android.mk:为什么在Android NDK代码中包含时,包含路径不可见?,android,c++,android-ndk,include-path,Android,C++,Android Ndk,Include Path,我想为我的Android NDK项目添加一个包含路径,但编译器找不到包含的文件。我仔细检查了系统中是否存在包含的文件。我做错了什么 Android.mk: include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_CFLAGS := -Wno-write-strings LOCAL_C_INCLUDES +:= $(LOCAL_PATH) LOCAL_CFLAGS +:= -O3 LOCAL_CPPFLAGS +:=$(LOCAL_CF
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_CFLAGS := -Wno-write-strings
LOCAL_C_INCLUDES +:= $(LOCAL_PATH)
LOCAL_CFLAGS +:= -O3
LOCAL_CPPFLAGS +:=$(LOCAL_CFLAGS)
LOCAL_CFLAGS := -I/absolute/path/to/my/include //--->here the include path is set
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS := -ldl -llog -lc
include $(BUILD_SHARED_LIBRARY)
jni/hello-jni.cpp中包含的标题:
extern "C" {
#include <codecs/codecs.h>
#include <test/test.h>
#include <mymath/mymath.h>
}
....
尝试在LOCAL_C_INCLUDES中添加标题我认为问题在于这一行:
LOCAL_CPPFLAGS +:=$(LOCAL_CFLAGS)
这里使用+:=
意味着使用的本地\u CFLAGS的值是在声明本地\u CPPFLAGS时的值。此时未设置本地\u CFLAGS(在下一行中设置)。尝试将其更改为:
LOCAL_CPPFLAGS +=$(LOCAL_CFLAGS)
这将在每次使用时评估本地CPPU标志,并将选择正确的值。或者,在本地标记中使用本地标记之前,先声明本地标记。您的Android.mk不遵循基本规则。让我们尝试重写:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_CFLAGS := -Wno-write-strings
ifneq ($(NDK_DEBUG),1)
LOCAL_CFLAGS += -O3
endif
LOCAL_C_INCLUDES := /absolute/path/to/my/include
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS := -ldl -llog -lc
include $(BUILD_SHARED_LIBRARY)
这假设您有文件
/absolute/path/to/my/include/codecs/codecs.h
等或/jni/codecs/codecs.h
。如果您的项目也有jni/test/test.h
和jni/mymath/mymath.h
,那么您可能根本不需要定义本地\u C\u INCLUDES
jni
目录将自动使用也许可以尝试ndk build V=1
并查看gcc命令行的实际外观?您确定路径正确吗?无需将LOCAL\u CFLAGS
复制到LOCAL\u CPPFLAGS
。NDK对C和C++bu源代码都使用LOCAL\u CFLAGS
。不要把它们与LOCAL\u CONLYFLAGS
@AlexCohn混淆好吧,我只是觉得+:=
看起来很奇怪,这是你在make中很少看到的东西。我直到现在才检查NDK文档。他们说更喜欢LOCAL\u C\u INCLUDES
而不是LOCAL\u CFLAGS:=-I.
。唯一的问题是,LOCAL_C_include可能不允许绝对路径,文档不清楚(它们称为“相对于NDK根目录的路径列表”)。但是无论如何,ndk构建系统应该将CFLAGS
var添加到CPPFLAGS
,可能使用+:=搞砸了。不,LOCAL\u C\u INCLUDES
接受绝对路径。它们直接转换为-Ithis-Ithat
,无需路径操作(不同于本地\u SRC\u文件
)。而且,LoalAlgCfLAGS对C和C++编译都有影响。有一个特殊的(也是相对较新的)新增的CONLYFLAGS
,其行为更像GNU make的常见CFLAGS
。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_CFLAGS := -Wno-write-strings
ifneq ($(NDK_DEBUG),1)
LOCAL_CFLAGS += -O3
endif
LOCAL_C_INCLUDES := /absolute/path/to/my/include
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS := -ldl -llog -lc
include $(BUILD_SHARED_LIBRARY)