我正在尝试使用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”文件的位置。
答案 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>