Сборка нативной библиотеки с помощью отдельного набора инструментов для Android - PullRequest
5 голосов
/ 22 декабря 2011

Я пытаюсь собрать libraw как общую библиотеку Android. Похоже, что библиотека слишком сложна для использования с Android.mk и т. Д., Или лучше: я пока не могу этого сделать.

Я попробовал использовать автономный набор инструментов из NDK, но я застрял при компиляции этой библиотеки.

Это путь, по которому я беру компиляцию библиотеки. Пожалуйста, укажите, если я делаю очевидные ошибки:

  1. Я скачал ndk.
  2. пробег: make-standalone-toolchain.sh
  3. Добавлена ​​папка bin этого отдельного набора инструментов в качестве первого элемента в моем PATH.
  4. Ран ./configure с --host=arm-linux-androideabi. Это удалось
  5. Ран make, здесь он очень быстро разбился.
    LibRaw-0.14.4$ make
    depbase=`echo internal/dcraw_common.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
        /bin/bash ./libtool --tag=CXX   --mode=compile arm-linux-androideabi-g++ -DPACKAGE_NAME=\"LibRaw\" -DPACKAGE_TARNAME=\"libraw\" -DPACKAGE_VERSION=\"0.14.4\" -DPACKAGE_STRING=\"LibRaw\ 0.14.4\" -DPACKAGE_BUGREPORT=\"info@libraw.org\" -DPACKAGE_URL=\"http://www.libraw.org\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I.   -I/usr/local/include  -g -O2 -MT internal/dcraw_common.lo -MD -MP -MF $depbase.Tpo -c -o internal/dcraw_common.lo internal/dcraw_common.cpp &&\
        mv -f $depbase.Tpo $depbase.Plo
    libtool: compile:  arm-linux-androideabi-g++ -DPACKAGE_NAME=\"LibRaw\" -DPACKAGE_TARNAME=\"libraw\" -DPACKAGE_VERSION=\"0.14.4\" "-DPACKAGE_STRING=\"LibRaw 0.14.4\"" -DPACKAGE_BUGREPORT=\"info@libraw.org\" -DPACKAGE_URL=\"http://www.libraw.org\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -I/usr/local/include -g -O2 -MT internal/dcraw_common.lo -MD -MP -MF internal/.deps/dcraw_common.Tpo -c internal/dcraw_common.cpp  -fPIC -DPIC -o internal/.libs/dcraw_common.o
    internal/dcraw_common.cpp: In member function 'void LibRaw::read_shorts(ushort*, int)':
    internal/dcraw_common.cpp:119: error: 'swab' was not declared in this scope
    internal/dcraw_common.cpp: In member function 'void LibRaw::write_ppm_tiff()':
    internal/dcraw_common.cpp:9235: error: 'swab' was not declared in this scope
    make: *** [internal/dcraw_common.lo] Error 1

Я сомневаюсь, что это сообщение об ошибке полезно здесь в stackoverflow, но у меня остается вопрос, не нужно ли мне применить некоторые дополнительные флаги или конфигурацию, чтобы заставить это работать?

Обратите внимание, что я могу успешно скомпилировать эту библиотеку, если просто компилирую для моей системы без кросс-компиляции. (Linux 32bit).

Когда я смотрю инструкцию по сборке GDAL для Android ( здесь ), она использует дополнительную настройку LIBS="-lsupc++ -lstdc++". Это связывает исключения STL и C ++? Однако, когда я устанавливаю их перед запуском configure, я сразу получаю сообщения об ошибках типа:

configure:3018: checking whether the C++ compiler works
configure:3040: arm-linux-androideabi-g++    conftest.cpp -lsupc++ -lstdc++ >&5
/tmp/android-chain/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lsupc++
collect2: ld returned 1 exit status

Итак, я немного застрял. У кого-то есть идея?

Ответы [ 2 ]

4 голосов
/ 09 января 2012

Мне пришлось добавить реализацию функции swab, поскольку в NDK ее нет. Впоследствии это скомпилировалось нормально (но я использовал crystax ndk).

Лучше было бы просто использовать файл Android.mk и использовать ndk-build для его компиляции.

2 голосов
/ 24 декабря 2011

Ошибка компоновщика в нижней части вашего вопроса возникает из-за того, что make-standalone-toolchain.sh из NDK r7 создает неполный набор инструментов (он пропускает некоторые библиотеки, включая libsupc++.a).Я рекомендую вам попробовать создать набор инструментов из одного из предыдущих выпусков NDK (r6b должен быть в порядке).

...