嵌入式bonjour mdnsresponder for android无法正常工作(错误-65563;守护程序未运行)

时间:2012-11-08 17:34:38

标签: android android-ndk bonjour mdns

由于jmDNS不支持按子类型进行服务浏览,因此我选择了交叉编译bonjour for android,然后按照以下步骤操作。

  1. 交叉编译了mdnsresponder for android
  2. 使用jni包装器编写dns-sd客户端,该包装器使用具有2个jni函数的上述共享库:
    1. 一个用于调用主循环
    2. 浏览服务的另一个
  3. 我用wifi MulticastLock编写了一个java应用程序
  4. 但是当我调用DNSServiceBrowse时,我得到的错误响应是DNS service call failed -65563,“后台守护程序没有运行”。

    通常在linux上运行时我们启动mdns守护进程。

    如何解决此问题?有什么建议吗?

2 个答案:

答案 0 :(得分:2)

  

但是当我调用DNSServiceBrowse时,我得到的错误响应是DNS服务调用失败-65563,"后台守护程序没有运行"。

您无法在Android中运行守护进程。请参阅:Android daemon process

要在嵌入式实现中使用mdnsresponder,您必须直接与mDNSCore通信。请参阅"工作原理"本[1]的自述文章部分。

  

如何解决此问题?

查看"注意" mDNSEmbedded.h中的部分[2]基本上不是通过守护进程通信,而是需要在[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]

答案 1 :(得分:1)

这意味着当你得到" DNS服务调用失败-65563"时,你还没有启动服务。

mdnsresponder包中有一个DNSSDEmbeddedDaemon类,您需要先使用此java类启动守护程序服务,然后调用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();
    }
}