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

时间:2012-09-11 21:34:26

标签: 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 文件夹。这意味着它将作为编译器登陆-I标志,如下所示:

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

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

所以相对包含路径与LOCAL_SRC_FILES之间存在差异,这些路径与jni文件夹相关!

1 个答案:

答案 0 :(得分:4)

您可能在目录v8.h或其他地方......

中有文件../include

你应该添加行

LOCAL_C_INCLUDES = $(LOCAL_PATH)/../include

请注意,与您不需要LOCAL_SRC_FILES的{​​{1}}不同,此处必须将所有目录的完整路径放在必要的$(LOCAL_PATH)文件中。