Подтвердить что ты не робот

Как скомпилировать статическую библиотеку с помощью Android NDK?

Я пытаюсь скомпилировать статическую библиотеку для использования на Android, но я не могу понять, как ее скомпилировать. Библиотека использует стандартные библиотеки (stdio.h и т.д.) И libxml2.

Я пытаюсь скомпилировать с помощью arm-eabi-gcc, но я получаю следующую ошибку:

/cygdrive/c/android-ndk-r4/build/platforms/android-8/arch-x86/usr/include/asm/posix_types.h:15:28: error: posix_types_64.h: Нет такого файла или каталог

Как мне заставить это работать?

4b9b3361

Ответ 1

Как я понимаю, правильным методом является использование ndk-build, а не непосредственный вызов компилятора.

В Android.mk вам нужно указать модуль для каждой статической библиотеки, которую вы хотите скомпилировать, а затем указать, что ваша общая библиотека должна ее использовать.

Пример модифицированного файла Android.mk в примере проекта hello-jni:

LOCAL_PATH := $(call my-dir)

# Define vars for library that will be build statically.
include $(CLEAR_VARS)
LOCAL_MODULE := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES :=  <list_of_src_files>

# Optional compiler flags.
LOCAL_LDLIBS   = -lz -lm
LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g

include $(BUILD_STATIC_LIBRARY)

# First lib, which will be built statically.
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_STATIC_LIBRARIES := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Если вы хотите контролировать, какие модули компилировать при запуске ndk-build, вы можете создать файл Application.mk (в том же каталоге, что и Android.mk), и перечислить все модули как в следующем примере:

APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>

Ответ 2

В ответ на

Можете ли вы создать статическую библиотеку (файл .a) без общей библиотеки который использует его?

(который действительно должен был быть его собственным вопросом), ответ да.

По умолчанию NDK будет создавать только исполняемые файлы и разделяемые библиотеки (с их зависимостями, конечно). Однако вы можете заставить NDK создавать автономную статическую библиотеку, явно ссылаясь на нее в вашем Application.mk.

Предполагая, что ваш статический библиотечный модуль LOCAL_MODULE: = libXYZ, добавьте следующую строку в Application.mk (создав файл в той же папке, что и ваш Android.mk, если он не существует):

APP_MODULES := XYZ

Обратите внимание, что значение APP_MODULES не содержит префикс lib, включенный в имя вашего статического библиотечного модуля.

В качестве альтернативы, если вы не хотите создавать Application.mk, вы можете указать значение в командной строке: ndk-build APP_MODULES=XYZ

Ответ 3

Прохладный трюк: если у вас есть файл Android.mk, вы можете изменить тип сборки:

include $(BUILD_SHARED_LIBRARY)

к

include $(BUILD_STATIC_LIBRARY)
Библиотеки

и .a будут выводиться в каталог obj/в соответствующие архитектуры при создании ndk-библиотеки.