我无法将我的库包含在 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 之间存在差异!