【问题标题】:Unable to find header files - Android NDK找不到头文件 - Android NDK
【发布时间】:2011-06-03 10:47:51
【问题描述】:

我正在通过 NDK 将原生 API 包装到 Android。

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

我有以下结构。

项目/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% 文件夹上都有一个包含文件夹。

使用 ndk-build 时,我得到一个 “/home/marcos/dev/workspace/rmsdk.native.wraper/jni/DelegateDRMProcessorClient.h:18:20:错误:dp_all.h:没有这样的文件或目录”

任何人都知道如何包含这些头文件以供编译器使用?

【问题讨论】:

  • dp_all.h所在的路径是什么?
  • 项目/jni/prereqs/dp/include
  • @Marcos,您介意分享一下您如何导入静态库“adept cryptopenssl dp expat fonts hobbes jpeg mschema png t3 xml zlib”吗?我想导入其中一些库,但我很难。比如你是怎么编译zlib到这里来导入的?

标签: android android-ndk


【解决方案1】:

我解决了,将所有标题放在一个文件夹中,并在 Android.mk 中包含以下行

LOCAL_C_INCLUDES := $(LOCAL_PATH)/include-all

这可行,但看起来不是最好的方法。

【讨论】:

    【解决方案2】:

    我参加这个聚会有点晚了,但遇到了同样的问题,可能对您的评论有答案: “这可行,但看起来不是最好的方法”

    NDK 中有一个名为“module-exports”的示例 它展示了如何构建一个 Android.mk 文件,该文件尊重位于其正确目录中的头文件,而不是全部转储到单个包含目录中。

    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 文件,递归地在我自己的另一个问题中得到了回答
    • 你能附上你提到的答案的链接吗?
    【解决方案3】:

    几年后...

    要导出包含目录而不是单个文件,我使用以下内容:

    LOCAL_EXPORT_C_INCLUDE_DIRS  := $(MY_DIRECTORY_PATH)
    

    例如,对于上述问题,“foo”的导出如下所示:

    LOCAL_EXPORT_C_INCLUDE_DIRS  := $(LOCAL_PATH)/foo
    

    【讨论】:

    • "LOCAL_EXPORT_C_INCLUDES :="
    • 谢谢星光。看起来构建规则已更新。由于您已经测试了较新的规则,因此您可以随时更改答案。 _DIRS 当时为我工作。
    【解决方案4】:

    为了方便新人,我只想添加将所有头文件移动到 LOCAL_C_INCLUDES := $(LOCAL_PATH) 引用的文件夹中,然后保存 android.mk 并重新启动 Eclipse。在尝试了上述所有解决方案后,这对我有用。

    【讨论】:

    • 这里的问题描述了您在许多子文件夹中有标题的情况,您可以将所有 .h 添加到一个文件夹中,并且导入确实可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多