Как написать / отладить Android.mk для статической библиотеки NDK? - PullRequest
6 голосов
/ 28 апреля 2011

Я пытаюсь создать статическую библиотеку, используя последнюю версию 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 (удаление несуществующих папок), но ничего не связанного с проектом или подпроектом.

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

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

Ответы [ 3 ]

9 голосов
/ 28 апреля 2011

Я бы порекомендовал избавиться от 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 делает правильные вещи, но заставить меня прыгать через нужные обручи из командной строки для меня все еще не получилось.

РЕДАКТИРОВАТЬ: так было умеренно интересно выяснить это, как это было давно, так как я играл с 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. Я предполагаю, что он просто не будет создавать статическую библиотеку, если нет зависимости.

1 голос
/ 13 февраля 2013

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

0 голосов
/ 14 мая 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...