【问题标题】:embedded bonjour mdnsresponder for android not working (error -65563; daemon not running)用于 android 的嵌入式 bonjour mdnsresponder 无法正常工作(错误 -65563;守护程序未运行)
【发布时间】:2012-11-08 17:34:37
【问题描述】:
由于 jmDNS 不支持子类型的服务浏览,所以我选择交叉编译 bonjour for android,并按照以下步骤操作。
- 交叉编译了安卓的 mdnsresponder
- 编写了带有 jni 包装器的 dns-sd 客户端,该客户端使用了具有 2 个 jni 函数的上述共享库:
- 一个用于调用主循环
- 另一个用于浏览服务
- 我用 wifi MulticastLock 编写了一个 java 应用程序
但是当我调用 DNSServiceBrowse 时,我得到的错误响应是 DNS service call failed -65563,“后台守护程序未运行”。
通常在 linux 上运行时,我们会启动 mdns 守护进程。
我该如何解决这个问题?有什么建议吗?
【问题讨论】:
标签:
android
android-ndk
bonjour
mdns
【解决方案1】:
但是当我调用 DNSServiceBrowse 时,我得到的错误响应是 DNS 服务调用失败 -65563,“后台守护程序未运行”。
您无法在 Android 中运行守护程序。见:Android daemon process
为了在嵌入式实现中使用 mdnsresponder,您必须直接与 mDNSCore 通信。请参阅本自述文件的“工作原理”部分,位于 [1]。
我该如何解决这个问题?
查看 [2] 中 mDNSEmbedded.h 中的“注意”部分 基本上,您需要使用 [3] 中的 dnssd_clientshim.c,而不是通过守护进程进行通信。这使您可以"still use the preferred dns_sd.h APIs by linking in "dnssd_clientshim.c", which implements the standard "dns_sd.h" API calls, allocates any required storage using malloc(), and then calls through to the low-level malloc-free mDNSCore routines"
注意:似乎 dnssd_clientshim.c 有一些拼写错误和缺少参考,这将阻止编译,因此您需要在构建时执行补丁(参见 [4] 和 [5])。看来您仍然需要在编译时包含 dnssd_clientlib.c,否则您会在 TXTRecord 函数引用中遇到构建错误。
[1]
[2]
[3]
[4]
[5]
【解决方案2】:
这意味着当您收到“DNS 服务调用失败 -65563”时,您还没有启动该服务。
在mdnsresponder包中有一个DNSSDEmbeddedDaemon类,你需要先用这个java类来启动daemon服务,然后调用browse()找到你想要的网络服务。
顺便说一句,您需要为守护进程获取/释放多播锁。
这是你可能需要的一段示例代码,这是你在浏览网络服务之前启动的服务。
public class DNSSDEmbeddedDaemon extends Service {
private static final String TAG = DNSSDEmbeddedDaemon.class.getName();
public IBinder onBind(Intent paramIntent) {
return null;
}
public void onCreate() {
super.onCreate();
DNSSDEmbedded.listeners.clear();
DNSSDEmbedded.init(new DNSSDEmbedded.Listener() {
@Override
public void onStart() {
Log.d(TAG, "EmbededMDNS onStart");
}
@Override
public void onEnd() {
Log.d(TAG, "EmbededMDNS onEnd");
DNSSDEmbedded.listeners.clear();
}
@Override
public void onError() {
Log.d(TAG, "EmbededMDNS onError");
}
});
}
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "EmbededMDNS Exit() is called");
DNSSDEmbedded.Exit();
}
}