Проблемы с компиляцией avahi в проект Android NDK

За последние несколько дней мне было трудно собрать avahi в статическую или общую библиотеку для использования с существующим проектом Android NDK.

У нас есть несколько игр в магазинах App and Play, и моя задача — заставить мультиплеер работать в версиях для Android. В частности, задача заключается в замене компонента Bonjour, чтобы эти игры могли подключаться друг к другу через zeroconf.

Исследования показали, что avahi — это та библиотека, которую мы ищем, но на данный момент я открыт для всего, что будет работать!

Я надеюсь, что кто-нибудь здесь может либо помочь мне скомпилировать avahi, либо предложить другую, более подходящую (и более простую в установке) библиотеку.

Проект использует android-ndk-r8b и создается на OSX 10.7.4 с использованием командной строки (не eclipse)

Получен последний исходный код Avahi отсюда: http://www.linuxfromscratch.org/blfs/view/svn/basicnet/avahi.html

собрал все необходимые библиотеки, чтобы ./configure работал без ошибок.

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-static --disable-mono --disable-monodoc  --disable-gdbm --disable-libdaemon --disable-nls --disable-gtk --disable-gtk3 --disable-python --disable-qt3 --disable-qt4 --enable-core-docs --with-distro=none

./configure работает без явных красных флажков.

make приводит к этой ошибке компиляции:

socket.c: In function 'ipv6_pktinfo':
socket.c:271: warning: unused variable 'yes' [-Wunused-variable]
socket.c:270: warning: unused parameter 'fd' [-Wunused-parameter]
socket.c: In function 'avahi_send_dns_packet_ipv6':
socket.c:609: error: 'IPV6_PKTINFO' undeclared (first use in this function)
socket.c:609: error: (Each undeclared identifier is reported only once
socket.c:609: error: for each function it appears in.)
socket.c: In function 'avahi_recv_dns_packet_ipv6':
socket.c:869: error: 'IPV6_HOPLIMIT' undeclared (first use in this function)
socket.c:878: error: 'IPV6_PKTINFO' undeclared (first use in this function)
make[2]: *** [libavahi_core_la-socket.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Выяснил, что он не работает с библиотеками android-ndk-r8b, не находит ipv6.h или что-то в этом роде.

Проверил мой файл .bash_profile.sh:

export PATH=/Users/Muy01/Projects/Development/Android/android-sdks/tools/:$PATH
export PATH=/Users/Muy01/Projects/Development/Android/android-sdks/platform-tools/:$PATH
export PATH=/Users/Muy01/Projects/Development/Android/android-ndk-r8b/:$PATH

добавлен --host=arm-linux-androideabi в список аргументов ./configure, что приводит к этой ошибке:

checking host system type... Invalid configuration `arm-linux-androideabi': system `androideabi' not recognized

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

Нашел этот пост о создании соответствующего файла Android.mk: не удается скомпилировать avahi на Android

Понял, что у меня нет файлов Android.mk во всех подкаталогах.

Изучил, скачал, построил Androgenizer, чтобы попытаться преобразовать все файлы Makefile.am в файлы Android.mk. http://cgit.collabora.com/git/user/derek/androgenizer.git/

Не смог понять или найти информацию о том, как это сделать =/

Решил попробовать создать свой собственный файл Android.mk:

LOCAL_PATH := $(call my-dir)
ROOT_LOCAL_PATH :=$(call my-dir)

#Build avahi into a static lib
include $(CLEAR_VARS)
AVAHI_TOP := $(ROOT_LOCAL_PATH)/../avahi-0.6.31

MY_SOURCES := $(wildcard $(AVAHI_TOP)/avahi-core/*.c*)
MY_SOURCES += $(wildcard $(AVAHI_TOP)/avahi-common/*.c*)
LOCAL_C_INCLUDES := $(AVAHI_TOP)
LOCAL_SRC_FILES := $(MY_SOURCES:$(LOCAL_PATH)%=%)

LOCAL_MODULE    := avahi

include $(BUILD_STATIC_LIBRARY)

Приводит к ошибкам времени компиляции для avahi-core/iface-linux.c:33:0:

/avahi-0.6.31/avahi-core/iface-linux.h:27:8: Redefinition of 'struct AvahiInterfaceMonitorOSDep'
/avahi-0.6.31/avahi-core/iface.h:46:16: Originally defined here
/avahi-0.6.31/avahi-core/iface-linux.h:33:9: Redeclaration of enumerator 'LIST_IFACE'
/avahi-0.6.31/avahi-core/iface.h:52:9: Previous definition of 'LIST_IFACE' was here
/avahi-0.6.31/avahi-core/iface-linux.h:34:9: Redeclaration of enumerator 'LIST_ADDR'
/avahi-0.6.31/avahi-core/iface.h:53:9: Previous definition of 'LIST_ADDR' was here
/avahi-0.6.31/avahi-core/iface-linux.h:35:9: Redeclaration of enumerator 'LIST_DONE'
/avahi-0.6.31/avahi-core/iface.h:54:9: Previous definition of 'LIST_DONE' was here
/jni//../avahi-0.6.31/avahi-core/iface-linux.c: In function 'netlink_callback':

И теперь я в значительной степени застрял.

Я попытался #if 0 удалить файлы iface-linux.c и h, что привело к каскадному множеству других ошибок, так что, возможно, это плохая идея.

Думаете, что это может быть что-то, что я сделал неправильно с командой ./configure? Возможно, проблема с моим файлом Android.mk?

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

Любая помощь приветствуется! Я также отправил это в список рассылки avhi, и если я получу там ответ, я опубликую его здесь для потомков.

Спасибо, Крис


person slushduck    schedule 20.10.2012    source источник


Ответы (2)


Я продолжу здесь с решением, которое сработало для меня.

Мое решение состояло в том, чтобы использовать JMDNS вместо Avahi.

В списке рассылки Avahi мало трафика.

У JMDNS есть рабочие примеры. У меня ушло около 4 часов на настройку JMDNS в моей среде NDK и около дня на устранение некоторых «изгибов».

person slushduck    schedule 20.12.2012

  1. tar avahi-0.6.31
  2. patch -p1 < 0001-Add-Android-support.patch patch -p1 < 0002-Add-uninstalled.pc.in-files.patch
  3. cd avahi-0.6.31 ./configure --sysconfdir=/etc --localstatedir=/var make
  4. cd подкаталоги: make Android.mk

затем вы увидите Android.mk во всех подкаталогах.

ndk-build V=1 NDK_LOG=2 APP_ABI="armeabi armeabi-v7a"
person user2155848    schedule 14.03.2013