android - 如何在 Android NDK 的 Android.mk 文件中正确包含预建静态库?

标签 android c++ android-ndk

我无法将我的库包含在 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 文件夹。这意味着它将作为编译器登陆——我将其标记为如下所示:

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

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

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

最佳答案

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

你应该添加行

LOCAL_C_INCLUDES = $(LOCAL_PATH)/../include

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

关于android - 如何在 Android NDK 的 Android.mk 文件中正确包含预建静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12378245/

相关文章:

android - 试图避免多个布局级别

java - 自定义Action Bar如何实现?

.net - 在 .NET 中使用 C++ 类

c++ - 在 C++ 应用程序中查找未引用的方法

java - LibGDX 游戏崩溃并显示 "java platform se binary stopped working"

android - 在 Meteor mobile (android - cordova) 上使用 Braintree

java - Eventbus 事件订阅者

c++ - 类型转换内存 union

java - android静态初始化opencv 3.0无法加载库 "opencv_java3"

opengl-es - Android Studio NDK 错误,无法找到 GLES3/gl3.h,尽管它存在