将 avahi 编译到 Android NDK 项目中的问题
Posted
技术标签:
【中文标题】将 avahi 编译到 Android NDK 项目中的问题【英文标题】:Problems compiling avahi into Android NDK project 【发布时间】:2012-10-11 02:18:35 【问题描述】:在过去的几天里,我一直在尝试将 avahi 构建到静态或共享库中以用于现有的 android NDK 项目。
我们在 App and Play 商店中有一些游戏,我的任务是让多人游戏在 Android 版本中运行。 具体来说,该任务涉及替换 Bonjour 组件,以便这些游戏可以通过 zeroconf 相互连接。
研究似乎表明 avahi 是我们正在寻找的库,但在这一点上,我愿意接受任何可行的方法!
我希望这里有人可以帮助我进行 avahi 编译或建议另一个更合适(且更易于安装)的库。
项目使用 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 运行时没有明显的危险信号。
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 文件的帖子: 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 iface-linux.c 和 h 文件导致一系列其他错误,所以可能是个坏主意。
认为这可能是我使用 ./configure 命令做错了什么? 也许我的 Android.mk 文件有问题?
我认为这一定是很多开发人员正在处理的问题,所以我可能遗漏了一些东西,因为我似乎无法通过 google 找到任何好的信息。
任何帮助将不胜感激! 我也将它发送到了 avhi 邮件列表,如果我在那里得到回复,我会在这里发布以供后代使用。
谢谢, 克里斯
【问题讨论】:
【参考方案1】:我会在这里跟进对我有用的解决方案。
我的解决方案是使用 JMDNS 而不是 Avahi。
Avahi 邮件列表上的流量不多。
JMDNS 有可用的工作示例。 我花了大约 4 个小时在我的 NDK 环境中设置 JMDNS,大约花了一天时间来解决一些“问题”。
【讨论】:
【参考方案2】:tar avahi-0.6.31
patch -p1 < 0001-Add-Android-support.patch
patch -p1 < 0002-Add-uninstalled.pc.in-files.patch
cd avahi-0.6.31
./configure --sysconfdir=/etc --localstatedir=/var
make
cd 子目录:make Android.mk
然后,您将在所有子目录中看到Android.mk
。
ndk-build V=1 NDK_LOG=2 APP_ABI="armeabi armeabi-v7a"
【讨论】:
以上是关于将 avahi 编译到 Android NDK 项目中的问题的主要内容,如果未能解决你的问题,请参考以下文章
android NDK编译问题,在将项目中的JNI部分编译时,报出了错误,不能成功生成SO文件,