找不到头文件 - Android NDK

13

我正在使用NDK将一个本地API封装到Android上。

但是在构建时找不到头文件。

我的项目结构如下:

project/jni

Android.mk

LOCAL_PATH := $(call my-dir)

include $(call all-subdir-makefiles)

LOCAL_PATH :=/home/marcos/dev/workspace/rmsdk.native.wraper/jni

include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog
LOCAL_MODULE    := ndk1
LOCAL_SRC_FILES := native.c DelegateDRMProcessorClient.cpp
LOCAL_STATIC_LIBRARY := adept cryptopenssl dp expat fonts hobbes jpeg mschema png t3 xml zlib

include $(BUILD_SHARED_LIBRARY)

项目/jni/prereqs/

Android.mk(用于调用所有子目录的 Android.mk 文件)

LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)
include $(CLEAR_VARS)

项目/jni/prereqs/%lib%/

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    :=dp
LOCAL_SRC_FILES :=libdp.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_STATIC_LIBRARY)

每个%lib%文件夹下都有一个include文件夹。

使用ndk-build时,我遇到了一个错误: "/home/marcos/dev/workspace/rmsdk.native.wraper/jni/DelegateDRMProcessorClient.h:18:20: error: dp_all.h: No such file or directory"

有人知道如何将这些头文件包含进编译器中吗?


1
dp_all.h所在的路径是什么? - Chris Stratton
项目/jni/prereqs/dp/include - Marcos Vasconcelos
1
@Marcos,您能分享一下您如何导入静态库“adept cryptopenssl dp expat fonts hobbes jpeg mschema png t3 xml zlib”吗?我想导入其中的一些库但是遇到了困难。例如,您是如何编译zlib以便在此处导入它的? - Bitcoin Cash - ADA enthusiast
4个回答

15

我解决了这个问题,通过获取文件夹中的所有头文件,并在 Android.mk 中包含以下代码行。

LOCAL_C_INCLUDES := $(LOCAL_PATH)/include-all

这个方法可以工作,但不是最佳实践。


12

虽然我来晚了,但我遇到了同样的问题,可能对你的评论有答案:

NDK中有一个名为“module-exports”的示例,它展示了如何构建一个Android.mk文件,以尊重头文件存放在其正确目录中,而不是全部倒入单个include目录。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_CFLAGS := -DFOO=2
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo
LOCAL_EXPORT_CFLAGS := -DFOO=1
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar/bar.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := zoo
LOCAL_SRC_FILES := zoo/zoo.c
LOCAL_SHARED_LIBRARIES := bar
include $(BUILD_SHARED_LIBRARY)

好的,它可以使用单个Android.mk文件工作,递归地在我的另一个问题中得到了回答。 - Marcos Vasconcelos
2
你能否包含一个链接指向你所提到的答案? - Yichuan Wang

4
多年后...
为了导出包含目录而不是单个文件,我使用以下方法:
LOCAL_EXPORT_C_INCLUDE_DIRS  := $(MY_DIRECTORY_PATH)

例如,对于上述问题,“foo”的导出结果将如下所示:
LOCAL_EXPORT_C_INCLUDE_DIRS  := $(LOCAL_PATH)/foo

"LOCAL_EXPORT_C_INCLUDES := " - DevByStarlight
感谢Starlight。看起来构建规则已经更新了。您可以随时更改答案,因为您测试过新的规则。_DIRS当时适用于我。 - Keo Malope

1
为了方便新手,我想补充一点内容,将所有头文件移动到由LOCAL_C_INCLUDES := $(LOCAL_PATH)引用的文件夹中,然后保存android.mk并重新启动eclipse。在尝试了上面提到的所有解决方案之后,这对我很有效。

这里的问题描述了当您在许多子文件夹中拥有标头时,您可以将所有 .h 文件添加到一个文件夹中,导入操作将确实起作用。 - Marcos Vasconcelos

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