Я застрял, когда мои библиотеки включены в сборку Android NDK.
Библиотеки правильно скомпилированы и прекрасно работают при создании фиктивного файла cpp и сборке всего с помощью прямой команды 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!
У вас наверное есть файл v8.h
в каталоге ../include
или где-то еще …
Вы должны добавить строку
LOCAL_C_INCLUDES = $(LOCAL_PATH)/../include
Обратите внимание, что в отличие от LOCAL_SRC_FILES
где вам не нужно $(LOCAL_PATH)
, здесь вы должны положить полные пути всех каталогов, где необходимо .h
файлы есть.
Других решений пока нет …