使用Android NDK的标头

时间:2013-01-25 15:04:41

标签: android android-ndk

我正在尝试使用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 个答案:

答案 0 :(得分:5)

您的LOCAL_C_INCLUDES应包含../../../src/../../../inc目录,以便您使用#include <mylib/utils/Timer.hpp>,即:

LOCAL_C_INCLUDES := ../../../src/

为什么不将你的C和C ++标题和源文件放在Android项目的jni /目录中,靠近Android.mk文件?

请参阅:What is the difference between #include <filename> and #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:=(调用my-dir)放在第一行和其他一些缺失的make指令上。

  

Android.mk文件必须以LOCAL_PATH的定义开头   变量。它用于在开发树中查找源文件。   在此示例中,构建提供的宏函数“my-dir”   system,用于返回当前目录的路径(即   包含Android.mk文件本身的目录。)

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

答案 1 :(得分:0)

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

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

现在你可以简单地写

LOCAL_SRC_FILES  := mylib/utils/Timer.cpp

但是对于includes,路径应该被定义为来自 current 的相对路径,即MyProject/build/Android目录。在你的情况下,似乎正确的路径是

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

当您在mylib声明中指定#include时:

#include <mylib/utils/Timer.hpp>