4

我正在尝试使用 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 我试图指出我的“.hpp”文件在 Android.mk 文件中的位置。

4

2 回答 2

5

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

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

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

请参阅:#include <filename> 和 #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/jni 目录运行 ndk-build ,使用以下 Android.mk 似乎可以工作。

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 变量的定义开头。它用于在开发树中定位源文件。在这个例子中,构建系统提供的宏函数'my-dir'用于返回当前目录的路径(即包含Android.mk文件本身的目录)。

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

于 2013-01-25T15:14:07.117 回答
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

当您mylib#include语句中指定时:

#include <mylib/utils/Timer.hpp>
于 2013-01-25T21:20:53.423 回答