Как правильно добавить готовую статическую библиотеку в файл Android.mk Android NDK?

Я застрял, когда мои библиотеки включены в сборку 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!

6

Решение

У вас наверное есть файл v8.h в каталоге ../include или где-то еще …

Вы должны добавить строку

LOCAL_C_INCLUDES = $(LOCAL_PATH)/../include

Обратите внимание, что в отличие от LOCAL_SRC_FILES где вам не нужно $(LOCAL_PATH), здесь вы должны положить полные пути всех каталогов, где необходимо .h файлы есть.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]