Android NDK中的头文件

5
我正试图使用Android NDK编译自己的库,但是遇到了一些问题。 这是我的Android.mk文件:
# Define vars for library that will be build statically.
include $(CLEAR_VARS)
LOCAL_MODULE     := MyLib
LOCAL_SRC_FILES  := ../../../src/mylib/utils/Timer.cpp
LOCAL_C_INCLUDES := ../../../src/mylib/

# Optional compiler flags.
LOCAL_LDLIBS     = -lz -lm
LOCAL_LDLIBS    := -llog  
LOCAL_CPPFLAGS  := -std=c++0x

include $(BUILD_SHARED_LIBRARY)

当我使用 "ndk-build" 构建我的项目时,出现了以下错误:
Clean: mylib [armeabi]
Clean: stlport_shared [armeabi]
Clean: stlport_static [armeabi]
Compile++ thumb  : mylib <= Timer.cpp
jni/../../../src/mylib/utils/Timer.cpp:1:34: fatal error: mylib/utils/Timer.hpp: No such file or directory
compilation terminated.

为了提供信息,我将像这样包含.hpp文件:

#include <mylib/utils/Timer.hpp>

我不知道为什么头文件找不到,我的库在Xcode和eclipse中工作良好。

感谢您的时间!

编辑:这是我的项目架构,以便理解我的问题:http://i.imgur.com/aiah6zH.jpg。我正在尝试指示Android.mk文件中".hpp"文件所在的位置。

2个回答

5
您的LOCAL_C_INCLUDES应该包括../../../src/../../../inc目录,以便使用#include <mylib/utils/Timer.hpp>。例如:
LOCAL_C_INCLUDES := ../../../src/

为什么不把C和C++的头文件和源文件放在Android项目的jni/目录中,靠近Android.mk文件?
参见: #include 和#include "filename"之间的区别是什么? 此外,这是不正确的,因为第二个LOCAL_LDLIBS指令覆盖了当前模块中先前的LOCAL_LDLIBS指令。
LOCAL_LDLIBS     = -lz -lm
LOCAL_LDLIBS    := -llog  

如果想追加到一个make指令中,请使用:
LOCAL_LDLIBS    := -lz -lm
LOCAL_LDLIBS    += -llog 

或者 LOCAL_LDLIBS := -lz -lm -llog

编辑: 使用以下 Android.mk,如果您从 Android/jni 目录运行 ndk-build,则似乎可以工作。

LOCAL_PATH := $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)
LOCAL_MODULE     := MyLib
LOCAL_C_INCLUDES := ../../../inc/
LOCAL_SRC_FILES  := ../../../src/mylib/utils/Timer.cpp
include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)
LOCAL_MODULE    := MyNativeFinalSharedLib
LOCAL_LDLIBS    := -lz -lm -llog  
LOCAL_CPPFLAGS  := -std=c++0x
LOCAL_STATIC_LIBRARIES := MyLib   
include $(BUILD_SHARED_LIBRARY)

你还忘了在第一行加上LOCAL_PATH := (call my-dir),还有其他一些缺失的make指令。

一个Android.mk文件必须以定义LOCAL_PATH变量开始。它用于在开发树中定位源文件。在此示例中,build系统提供的宏函数'my-dir'用于返回当前目录的路径(即包含Android.mk文件本身的目录)。

(来自android-ndk-r8d/docs/ANDROID-MK.html)


感谢您的回复,但是codeLOCAL_C_INCLUDES := ../../../src/code这行代码没有起作用,我收到了以下错误提示:“不支持的源文件扩展名”。为了使架构更加清晰,我并没有将.cpp和.hpp文件放在同一个文件夹或JNI中,就像SFML等库一样。在我的项目中,我将当前项目包含在头文件搜索路径中,因此我可以在不搜索子文件夹的情况下包含文件,我也可以像这样包含“模块”:#include <Framework/graphic/graphic.hpp>这是我的项目架构:[链接]http://i.imgur.com/ln3ia9F.jpg - Glados
在这种情况下,您尝试过 LOCAL_C_INCLUDES := ../../../inc 吗?另外,您的 Android.mk 文件在哪里?它是否在 Android/jni 内部?您从哪里运行 ndk-build?您的源代码应该放在 LOCAL_SRC_FILES := ../../../src/source1.cpp ../../../source2.cpp 中。我建议您将外部代码编译为共享或静态库,然后在 Android.mk 文件中添加一个新模块,或者创建一个单独的文件来调用主 Android.mk 中的库,位于 Android/jni/ 目录内。 - Alex Bitek
是的,我也尝试过 :/。 Android.mk在jni文件夹中,这里有另一张更详细的图片[链接]http://i.imgur.com/aiah6zH.jpg。 - Glados
谢谢!那帮了我很多,找到了问题所在!现在我得在编译过程中处理 #include <unordered_map> ^^'。 - Glados
同样请查看以下相关讨论:https://groups.google.com/d/topic/android-ndk/VWxNghRtBjY/discussion 要使用C++标准库,您需要添加Android/jni下的Application.mk文件,其中包含以下内容:APP_OPTIM := debug APP_PLATFORM := android-14 APP_STL := gnustl_static APP_ABI := armeabi armeabi-v7a。同时确保您正在使用最新的Android SDK:android-ndk-r8d。请阅读android-ndk-r8d/docs/CPLUSPLUS-SUPPORT.html并检查android-ndk-r8d/samples目录以获取使用NDK的各种示例。 - Alex Bitek

0

强烈建议在Android.mk文件中定义$(LOCAL_PATH)。在您的情况下,最好的选择可能是

LOCAL_PATH := $(call my-dir)/../../../../src

现在你可以简单地写

LOCAL_SRC_FILES  := mylib/utils/Timer.cpp

但是对于包含文件,路径应该相对于当前目录进行定义,即MyProject/build/Android目录。在您的情况下,正确的路径似乎是:

LOCAL_C_INCLUDES := ../../../inc

当你在#include语句中指定mylib时:

#include <mylib/utils/Timer.hpp>

加粗路径应该被定义为相对于当前路径的,即 MyProject/build/Android 目录。加粗 这是主要的问题之一,非常感谢!(我在我的一个 .cpp 文件中有一个错误的 include,Xcode 并没有奇怪地显示任何信息。) - Glados

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