Привет хабрасообщество!
Многие задают вопрос: «У нас есть куча библиотек на С++, которые мы хотим собрать под Андроид. Как это сделать?». Ниже по шагам описан возможно самый простой способ это сделать.
Основным требованием к сырцам является только то, чтобы они были совместимы с gcc и POSIX (хотя иногда всяческие урезания и хаки могут быть неизбежны).
1. Для сборки чего-либо на С++ под Андроид из под винды нужно установить как минимум следующее:
Вся нативная билд-система основана на make. Есть свой скрипт ndk-build, который собирает С++. Чтобы он работал для вашей любимой библиотеки нужно сделать следующее:
2. В папку библиотеки положить файл default.properties со строкой target=android-8.
3. Здесь же создать папку jni и положить в неё 2 файла:
Application.mk с таким содержимым
и Android.mk вот такой:
4. После чего надо запустить Cygwin Bash Shell, перейти в папку, где находится папка jni, и из шелла выполнить команду
Если всё сделано правильно и ошибок компиляции нет, то соберётся статическая либа libMySuperProject.a (на самом деле даже 2 — под оба таргета: armeabi и armeabi-v7a), которые можно линковать с проектом. На все телодвижения уходит не более 15 минут.
Многие задают вопрос: «У нас есть куча библиотек на С++, которые мы хотим собрать под Андроид. Как это сделать?». Ниже по шагам описан возможно самый простой способ это сделать.
Основным требованием к сырцам является только то, чтобы они были совместимы с gcc и POSIX (хотя иногда всяческие урезания и хаки могут быть неизбежны).
1. Для сборки чего-либо на С++ под Андроид из под винды нужно установить как минимум следующее:
- Android SDK developer.android.com/sdk/index.html
- Android NDK developer.android.com/sdk/ndk/index.html
- Cygwin
Вся нативная билд-система основана на make. Есть свой скрипт ndk-build, который собирает С++. Чтобы он работал для вашей любимой библиотеки нужно сделать следующее:
2. В папку библиотеки положить файл default.properties со строкой target=android-8.
3. Здесь же создать папку jni и положить в неё 2 файла:
Application.mk с таким содержимым
APP_OPTIM := release
APP_PLATFORM := android-8
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_MODULES := MySuperProject
и Android.mk вот такой:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
GLOBAL_C_INCLUDES := \
$(LOCAL_PATH)/../Source \ <-- здесь нужно перечислить все нужные папки
LOCAL_SRC_FILES = а здесь перечислить все .с и .cpp файлы через пробел с путём относительно папки jni
LOCAL_MODULE := MySuperProject
GLOBAL_CFLAGS := -Werror -O3 -isystem $(SYSROOT)/usr/include/
LOCAL_CFLAGS := $(GLOBAL_CFLAGS)
LOCAL_C_INCLUDES := $(GLOBAL_C_INCLUDES)
include $(BUILD_STATIC_LIBRARY)
4. После чего надо запустить Cygwin Bash Shell, перейти в папку, где находится папка jni, и из шелла выполнить команду
ndk-build
Если всё сделано правильно и ошибок компиляции нет, то соберётся статическая либа libMySuperProject.a (на самом деле даже 2 — под оба таргета: armeabi и armeabi-v7a), которые можно линковать с проектом. На все телодвижения уходит не более 15 минут.