,由于JMDNS不支持子类型的服务浏览,所以我随身携带了Android的Cross,我遵循以下步骤。
。- Cross编译了Android的MDNSRESPONDER
- 用JNI包装器写了DNS-SD客户端,该包装使用上述具有2个JNI函数的共享库:
- 一个用于调用主循环的人
- 另一个用于浏览服务的
- 一个用于调用主循环的人
- 我已经用WiFi MulticastLock编写了Java应用程序
但是,当我调用DNSServiceBrowse时,我收到的错误响应是DNS service call failed -65563
,"背景守护程序都没有运行"。
通常在Linux上运行时,我们开始MDNS守护程序。
如何解决此问题?有任何建议吗?
但是,当我调用DNSServiceBrowse时,我收到的错误响应是DNS服务呼叫失败-65563,"背景守护程序未运行"。
您不能在Android中运行守护程序。请参阅:Android守护程序过程
为了在嵌入式实现中使用MDNSResponder,您必须直接与MDNSCORE进行通信。请参阅[1]。
如何解决此问题?
在[2]上查看mdnsembedded.h中的" note"部分,而不是通过守护程序进行通信,需要在[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]
这意味着您在获得" DNS服务呼叫失败-65563"时尚未启动服务。
MDNSResponder软件包中有一个DNSSDEMBEDDAEMON类,您需要使用此Java类首先启动守护程序服务,然后您可以调用Browse()查找所需的网络服务。
>顺便说一句,您需要为守护程序获取/释放mutlti-cast锁。
这是您可能需要的示例代码的一部分,这是您在浏览网络服务之前启动的服务。
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();
}
}