Intereting Posts
Рисованное тонирование для api <21 Предварительный просмотр камеры выполняется в портретном режиме, но захваченное изображение вращается NPE с переходными переходами с пустыми общими элементами OnClick не запускается на LinearLayout с дочерним Выделение текста в TextView или WebView Duplicate entry: com / android / volley / AuthFailureError.class при компиляции проекта в студии android Проблема обнаружения столкновений на основе пикселов с OpenGLES 2.0 под Android Недопустимое описание проекта при импорте проекта в Eclipse Как скрыть прогресс в Android? Выравнивание кнопок панели инструментов Android v7 Покупка в приложении: получите имя или идентификатор учетной записи Google Play, запрашивающей покупку Обнаружение вращения главного экрана Android Изменение цвета строки состояния при входе в контекстный режим действия Android пустой экран на onBack в loadDataWithBaseURL Отправка html почты, если приложение позволяет

Как написать / отладить Android.mk для статической библиотеки NDK?

Я пытаюсь построить статическую библиотеку, используя последнюю версию Android NDK (r5), и мне не повезло. Я смог собрать и запустить образцы (например, HelloJni) без каких-либо проблем, но начать новый проект с «нуля» был другой историей.

Для этого эксперимента я пытаюсь создать libpng. Структура моей папки выглядит так:

root | +--- jni | +---- Android.mk ( one line: "include $(call all-subdir-makefiles)" ) | +---- png | +---- Android.mk ( see below ) | +---- { a bunch of .c and .h files ) 

Итак, у меня есть два Android.mks. Один для построения всех подпроектов и один для подпроекта libpng. Root / jni / png / Android.mk выглядит так:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := png MODULE_PATH := $LOCAL_PATH LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.c) LOCAL_C_INCLUDES := $(wildcard $(LOCAL_PATH)/*.h) LOCAL_INTERMEDIATE_TARGETS += junk junk: echo $(LOCAL_SRC_FILES) include $(BUILD_STATIC_LIBRARY) 

Эта установка сборки ничего не делает (т.е. запуск ndk-build из корневой папки ничего не делает, даже после сборки ndk-build). Подробный прогон (ndk-build V = 1) показывает некоторые вызовы rm -f (удаление несуществующих папок), но ничего не связано с проектом или подпроектом.

Мне очень интересно, почему этот скрипт сборки терпит неудачу, но процесс должен был быть тривиальным, поэтому я уверен, что его ничего страшного интересного. Меня гораздо больше интересует, как я могу начать атаковать ошибки сборки самостоятельно. Вызов эха в приведенном выше скрипте никогда не попадает – я понятия не имею, как определить, какие значения или почему он пропускает подпроект. Кто-нибудь нашел способ узнать, что пытается создать система сборки?

Мне также было бы интересно узнать, есть ли документы для этих инструментов или есть ли только несколько текстовых файлов в папке документов NDK? Я пытался разрешить это, скопировав кусочки случайных Android.mk, которые я нашел из googling, но только несколько команд, используемых в простых образцах NDK, как представляется, документированы, поэтому опыт на самом деле только что поднял новые вопросы.

Solutions Collecting From Web of "Как написать / отладить Android.mk для статической библиотеки NDK?"

Я бы рекомендовал избавиться от MODULE_PATH и не пытаться использовать подстановочный знак: я действительно не видел эту работу правильно.

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := png LOCAL_SRC_FILES := pngget.c pngread.c pngrutil.c pngtrans.c pngwtran.c png.c pngmem.c pngrio.c pngset.c pngwio.c pngwutil.c pngerror.c pngpread.c pngrtran.c pngwrite.c LOCAL_C_INCLUDES := png.h pngconf.h pngpriv.h include $(BUILD_STATIC_LIBRARY) 

Кроме того, есть некоторая серьезная магия пути, которую я не полностью расшифровал: как-то Eclipse делает все правильно, но заставить его прыгать через правильные обручи из командной строки по-прежнему поражает или пропускает для меня.

EDIT: так умеренно заинтересовался разобраться в этом, так как это было некоторое время с тех пор, как я играл с NDK. Когда я использую исходный файл, он не компилируется, но когда я поместил исходный код png в каталог jni и затем использовал этот файл Android.mk:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := png LOCAL_SRC_FILES := pngget.c pngread.c pngrutil.c pngtrans.c pngwtran.c png.c pngmem.c pngrio.c pngset.c pngwio.c pngwutil.c pngerror.c pngpread.c pngrtran.c pngwrite.c LOCAL_C_INCLUDES := png.h pngconf.h pngpriv.h include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := png2 LOCAL_STATIC_LIBRARIES := png include $(BUILD_SHARED_LIBRARY) 

Он создал как libpng.a, так и libpng2.so в папке obj / local / armeabi. Я предполагаю, что он просто не будет создавать статическую библиотеку, если нет зависимости.

Последние два часа я избивал себя над головой этой проблемой, и этот пост помог решить эту проблему. Вместо того, чтобы добавлять фиктивную зависимость, просто вызовите ndk-build (который является только тонкой оболочкой над make) как «ndk-build png».

Я обнаружил, что когда я добавил «фиктивную» общую библиотеку, как описано в редакции, .a (который я нашел в obj /, подразумевая, что это была внутренняя деталь) не содержал ни одного из файлов .o, которые я хотел.

Кроме того, .so перекомпилировал все файлы, которые были бы созданы для статической библиотеки. Так что имело смысл, что .a был пуст.

Мне помогло добавить строку APP_MODULES в свой Application.mk, как описано в разделе « Невозможно создать статическую библиотеку с Android NDK R8» . Вероятно, вы все равно хотите Application.mk, так как он содержит другие настройки, важные для вашей статической библиотеки, такие как APP_STL, APP_PLATFORM, APP_ABI и т. Д.