用于android的嵌入式bonjour MDnsrresponder不工作(错误-65563;守护进程未运行)

用于android的嵌入式bonjour MDnsrresponder不工作(错误-65563;守护进程未运行),android,android-ndk,bonjour,mdns,Android,Android Ndk,Bonjour,Mdns,由于jmDNS不支持按子类型浏览服务,因此我开始交叉编译android版的bonjour,并遵循以下步骤 交叉编译用于android的MDnsrresponder 使用jni包装器编写dns sd客户端,该包装器使用具有2个jni函数的上述共享库: 一个用于调用主循环 另一个用于浏览服务的 我已经编写了一个带有wifi多播锁的java应用程序 但是当我调用DNSServiceBrowse时,得到的错误响应是DNS服务调用失败-65563,“后台守护程序未运行” 通常,在linux上运行时,我们

由于jmDNS不支持按子类型浏览服务,因此我开始交叉编译android版的bonjour,并遵循以下步骤

  • 交叉编译用于android的MDnsrresponder
  • 使用jni包装器编写dns sd客户端,该包装器使用具有2个jni函数的上述共享库:
  • 一个用于调用主循环
  • 另一个用于浏览服务的
  • 我已经编写了一个带有wifi多播锁的java应用程序
  • 但是当我调用DNSServiceBrowse时,得到的错误响应是
    DNS服务调用失败-65563
    ,“后台守护程序未运行”

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

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

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

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

    要在嵌入式实现中使用mdnsresponder,必须直接与mDNSCore通信。请参阅本自述文件[1]中的“如何工作”部分

    如何解决此问题

    查看[2]中mDNSEmbedded.h中的“Note”部分基本上不是通过守护进程进行通信,而是需要使用[3]中的dnssd_clientshim.c。这允许您通过链接“dnssd_clientshim.c”来
    “仍然使用首选的dns_sd.h API”,它实现标准的“dns_sd.h”API调用,使用malloc()分配任何所需的存储,然后调用低级的无malloc的mDNSCore例程”

    注意:dnssd_clientshim.c似乎有一些拼写错误和缺少的引用,这将阻止编译,因此在构建时需要执行修补程序(请参见[4]&[5])。在编译时,您似乎仍然需要包含dnssd_clientlib.c,否则您将在TXTROCK函数引用中遇到生成错误

    [] [] [] [] []

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

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

    要在嵌入式实现中使用mdnsresponder,必须直接与mDNSCore通信。请参阅本自述文件[1]中的“如何工作”部分

    如何解决此问题

    查看[2]中mDNSEmbedded.h中的“Note”部分基本上不是通过守护进程进行通信,而是需要使用[3]中的dnssd_clientshim.c。这允许您通过链接“dnssd_clientshim.c”来
    “仍然使用首选的dns_sd.h API”,它实现标准的“dns_sd.h”API调用,使用malloc()分配任何所需的存储,然后调用低级的无malloc的mDNSCore例程”

    注意:dnssd_clientshim.c似乎有一些拼写错误和缺少的引用,这将阻止编译,因此在构建时需要执行修补程序(请参见[4]&[5])。在编译时,您似乎仍然需要包含dnssd_clientlib.c,否则您将在TXTROCK函数引用中遇到生成错误

    [] [] [] []
    []

    这意味着您在收到“DNS服务呼叫失败-65563”时尚未启动服务

    mdnsresponder包中有一个DNSSDembeddedDemon类,您需要先使用此java类启动守护程序服务,然后可以调用browse()来查找所需的网络服务

    顺便说一下,您需要获取/释放守护进程的multi 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();
        }
    }
    

    这意味着您在收到“DNS服务调用失败-65563”时尚未启动服务

    mdnsresponder包中有一个DNSSDembeddedDemon类,您需要先使用此java类启动守护程序服务,然后可以调用browse()来查找所需的网络服务

    顺便说一下,您需要获取/释放守护进程的multi 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();
        }
    }