将avahi编译成Android NDK项目的问题

时间:2012-10-20 18:59:41

标签: android android-ndk zeroconf avahi

在过去的几天里,我一直很难将avahi构建到静态或共享库中,以便与现有的Android NDK项目一起使用。

我们在App and Play商店中有一些游戏,我的任务是让多人游戏在Android版本中运行。 具体来说,任务涉及替换Bonjour组件,以便这些游戏可以通过zeroconf相互连接。

研究似乎表明avahi是我们正在寻找的lib,但是在这一点上我对所有可行的东西持开放态度!

我希望这里有人可以帮助我进行avahi编译或建议另一个更合适(也更容易安装)的库。

Project使用android-ndk-r8b,使用命令行(不是eclipse)在OSX 10.7.4上构建

从这里获得最新的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运行时没有明显的红旗。

在此编译错误中生成结果:

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文件的这篇文章: can't compile avahi on 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'ing outace-linux.c和h文件导致其他错误的级联,所以问题不错。

认为这可能是我用./configure命令做错的事情? 我的Android.mk文件可能存在问题吗?

我认为这一定是很多开发人员正在处理的事情,所以我可能会遗漏一些东西,因为我似乎无法通过谷歌找到任何好的信息。

任何帮助将不胜感激! 我已经把它发送到avhi邮件列表,如果我得到回复,我会在这里发帖给后人。

谢谢, 克里斯

2 个答案:

答案 0 :(得分:1)

我会在这里跟进对我有用的解决方案。

我的解决方案是使用JMDNS而不是Avahi。

Avahi邮件列表上没有太多流量。

JMDNS有可用的工作示例。 JMDNS花了我大约4个小时在我的NDK环境中进行设置,大约一天时间来解决一些“扭结”。

答案 1 :(得分:0)

  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
  5. 然后,您将在所有子目录中看到Android.mk

    ndk-build V=1 NDK_LOG=2 APP_ABI="armeabi armeabi-v7a"