【问题标题】:How to include a prebuilt static library in Android NDK's Android.mk file correctly?如何在 Android NDK 的 Android.mk 文件中正确包含预构建的静态库?
【发布时间】:2012-09-11 21:34:25
【问题描述】:

我无法将我的库包含在 Android NDK 构建中。

在创建虚拟 cpp 文件并在 shell 中使用直接 g++ 命令构建所有内容时,这些库已正确编译并且工作正常。

当前的 Android.mk 文件不起作用并抛出一个错误,即找不到相应的头文件(属于 .a 文件的一部分)。

如何正确包含预构建的静态库?

我的 Android.mk 文件如下所示:

LOCAL_PATH := $(call my-dir)


# V8 Base

include $(CLEAR_VARS)

LOCAL_MODULE          := v8_base
LOCAL_MODULE_FILENAME := v8_base_static
LOCAL_SRC_FILES := ../lib/libv8_base.a

include $(PREBUILT_STATIC_LIBRARY)


# V8 Nosnapshot

include $(CLEAR_VARS)

LOCAL_MODULE          := v8_nosnapshot
LOCAL_MODULE_FILENAME := v8_nosnapshot_static
LOCAL_SRC_FILES := ../lib/libv8_nosnapshot.a

include $(PREBUILT_STATIC_LIBRARY)


# V8GL Runtime

include $(CLEAR_VARS)

LOCAL_MODULE    := v8gl-runtime
LOCAL_SRC_FILES := main.c ../src/v8gl/v8gl.cpp
LOCAL_CPPFLAGS  := -D__ANDROID__
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue v8_base v8_nosnapshot

# LOCAL_EXPORT_CPPFLAGS := -D__ANDROID__

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

编译器输出如下,这是有道理的,但只显示没有包含单个 .a 文件,我不知道为什么:

Compile++ thumb  : v8gl-runtime <= v8gl.cpp
(... g++ call)
In file included from jni/../src/v8gl/v8gl.cpp:6:
jni/../src/v8gl/v8gl.h:5:16: error: v8.h: No such file or directory

绝对路径解决方案

感谢@alex-cohn 的提示,我发现包含被错误地指出。 所以我决定使用在调用 ndk-build 之前设置的包含绝对路径的环境变量。这解决了包含问题。

所以最后一个模块,实际包含完成的地方,现在看起来像:

ADK_PATH=/var/whatever/to/your/project/root_not_jni

include $(CLEAR_VARS)
LOCAL_MODULE    := v8gl-runtime
LOCAL_SRC_FILES := main.c ../src/v8gl/v8gl.cpp

LOCAL_C_INCLUDES:= $(ADK_PATH)/external/v8/include

LOCAL_CPPFLAGS  := -D__ANDROID__
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue v8_base v8_nosnapshot

现在它还显示包含这些库,因为它们是在之后编译的 - 无论出于何种原因。

具有相对路径的解决方案

所有包含路径都相对于 项目根文件夹 而不是 jni 文件夹。这意味着它将作为编译器着陆 -I 标记如下:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../file_in_project.root

# resulting g++ flag:
-Ijni/../file_in_project.root

所以相对包含路径和相对于 jni 文件夹的 LOCAL_SRC_FILES 是有区别的!

【问题讨论】:

  • 没错!现在你做对了!

标签: android c++ android-ndk


【解决方案1】:

您可能在目录../include 或其他地方有文件v8.h...

你应该添加一行

LOCAL_C_INCLUDES = $(LOCAL_PATH)/../include

请注意,与不需要$(LOCAL_PATH)LOCAL_SRC_FILES 不同,这里必须将所有目录的完整路径放在必要的.h 文件所在的位置。

【讨论】:

  • 仍然是同样的错误,我将 LOCAL_C_INCLUDES 添加到最后一个模块,即 v8gl-runtime,它们是必需的。奇怪的是,编译器包括仍然相对的库。所以有一个像这样的最终 g++ 命令: -I jni/../../external/v8/include 所以这有点奇怪,因为我不知道如何让 $(LOCAL_PATH) 从/.
  • 路径不是绝对的也没关系。能否发布新构建日志的相关行(V=1)?另外,检查jni/../../external/v8/include 目录是否真的包含v8gl.h 文件。另外,检查jni/../src/v8gl/v8gl.cpp 文件中的#include 语句:是否只是#include "v8gl.h"
  • 我刚刚意识到问题出在哪里,路径是相对于项目根文件夹的,而不是 jni/Android.mk 文件。超级愚蠢和令人困惑的是 src 文件与 jni 文件夹相关,而 include 与项目文件夹相关。再次,非常感谢!
  • 其实你应该小心你的结论。 LOCAL_PATH 是您的 Android.mk 所在的位置;如果您的项目包含多个模块,并且有些模块使用自己的 Android.mk 文件分布在其他目录中,您会看到每个模块的LOCAL_SRC_FILES相对于到不同的根目录。另一方面,LOCAL_C_INCLUDES 相对于 make(换句话说,ndk-build)运行的 当前目录。没错,通常它是您的 Android 项目的根目录。但 NDK 也支持其他构建场景。
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 2023-03-23
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多