【问题标题】:Headers with Android NDK带有 Android NDK 的标头
【发布时间】:2013-01-27 17:35:59
【问题描述】:

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

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

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

    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/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',由构建提供 system,用于返回当前目录的路径(即 包含 Android.mk 文件本身的目录)。

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

    【讨论】:

    • 感谢您的回复,但行 codeLOCAL_C_INCLUDES := ../../../src/code 不起作用,我收到以下错误:“不支持的源文件扩展名”。为了架构清晰,我没有将 .cpp 和 .hpp 文件放在同一个文件夹或 JNI 中,请查看类似 SFML 的库,他们也这样做了:)。在我的项目中,我将当前项目包含在标题搜索路径中,因此我可以包含文件而不在子文件夹中搜索,我也可以包含一个“模块”,例如“#include 这里是我的项目架构:[链接]i.imgur.com/ln3ia9F.jpg
    • 在那种情况下你试过LOCAL_C_INCLUDES := ../../../inc吗?还有你的 Android.mk 文件在哪里?它在 Android/jni 里面吗?您从哪里运行 ndk-build?您的来源应该转到 LOCAL_SRC_FILES := ../../../src/source1.cpp ../../../source2.cpp 另外我建议您将外部代码编译为共享或静态库,然后然后你在 Android.mk 文件中为它添加一个新模块,或者为你的库创建一个单独的文件并从 Android/jni/ 目录中的主 Android.mk 调用它。
    • 是的,我也试过了:/。 Android.mk 在 jni 文件夹中是的,这是另一张图片,有更多细节 [link]i.imgur.com/aiah6zH.jpg
    • 谢谢!这对我发现问题有很大帮助!现在我必须在编译期间处理#include ^^'。
    • 还可以查看相关讨论: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 的各种示例。
    【解决方案2】:

    强烈建议让您的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>
    

    【讨论】:

    • bold路径应定义为相对于当前目录,即 MyProject/build/Android 目录。**bold** 这是主要问题之一,非常感谢! (我的一个 .cpp 文件中包含错误的另一个问题,Xcode 没有说任何奇怪的东西。
    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多