0

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

  1. 交叉编译了 android 的 mdnsresponder
  2. 使用具有 2 个 jni 函数的上述共享库编写了带有 jni 包装器的 dns-sd 客户端:
    1. 一种用于调用主循环
    2. 另一个用于浏览服务
  3. 我用 wifi MulticastLock 编写了一个 java 应用程序

但是当我调用 DNSServiceBrowse 时,我得到的错误响应是DNS service call failed -65563“后台守护程序未运行”。

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

我该如何解决这个问题?有什么建议么?

4

2 回答 2

2

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

您不能在 Android 中运行守护程序。请参阅:Android 守护进程

为了在嵌入式实现中使用 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 ]

于 2013-01-31T20:04:43.673 回答
1

这意味着当您收到“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();
    }
}
于 2014-05-08T21:59:38.397 回答