Как скомпилировать статическую библиотеку с помощью Android NDK? - PullRequest
33 голосов
/ 31 мая 2010

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

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

/ cygdrive / c / android-ndk-r4 / build / платформы / android-8 / arch-x86 / usr / include / asm / posix_types.h: 15: 28: ошибка: posix_types_64.h: такого файла нет или каталог

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

Ответы [ 3 ]

46 голосов
/ 02 июня 2010

Насколько я понимаю, правильный метод - использовать 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>
8 голосов
/ 04 марта 2014

В ответ на

Можете ли вы создать статическую библиотеку (файл .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

2 голосов
/ 18 июня 2015

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

include $(BUILD_SHARED_LIBRARY)

до

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

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

...