0

请我想构建一个 NSD(网络服务发现)应用程序,使用 Jni 和 Qt,但我收到以下错误:

应用程序中的 JNI 检测到错误:调用 JNI GetStaticMethodID 时出现未决异常 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.String)”

我正在尝试调用函数:c++ 部分中的 discover()

下面是代码:

import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;
import android.net.*;
import android.net.wifi.WifiManager;
import android.net.wifi.*;
import  android.net.ConnectivityManager;
import  android.net.wifi.WifiInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.DhcpInfo;
import  android.net.nsd.NsdManager;
import android.net.nsd.NsdManager.DiscoveryListener;
import android.util.Log;
import android.net.nsd.NsdServiceInfo;
import android.text.format.Formatter;

import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.net.InetAddress;
import  java.io.IOException;
import  java.net.UnknownHostException;
//import android.app.Activity;


import java.lang.reflect.Method;

 public  class MusicList extends org.qtproject.qt5.android.bindings.QtActivity {
     final String TAG="Display Message";
     final String SERVICE_TYPE="_http._tcp.";
     final  String serviceName= "esp32";

      private static NsdManager.DiscoveryListener  discoveryListener;
      private static NsdManager nsdManager;

      private static Context context;


     public void initializeDiscoveryListener() {

         // Instantiate a new DiscoveryListener

           discoveryListener = new NsdManager.DiscoveryListener() {

             // Called as soon as service discovery begins.
             @Override
             public void onDiscoveryStarted(String regType) {
                 Log.d(TAG, "Service discovery started");
             }

             @Override
             public void onServiceFound(NsdServiceInfo service) {
                 // A service was found! Do something with it.
                 Log.d(TAG, "Service discovery success" + service);
                 if (!service.getServiceType().equals(SERVICE_TYPE)) {
                     // Service type is the string containing the protocol and
                     // transport layer for this service.
                     Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
                 } else if (service.getServiceName().equals(serviceName)) {
                     // The name of the service tells the user what they'd be
                     // connecting to. It could be "Bob's Chat App".
                     Log.d(TAG, "Same machine: " + serviceName);
                 } else if (service.getServiceName().contains("NsdChat")){
                    // nsdManager.resolveService(service, resolveListener);
                 }
             }

             @Override
             public void onServiceLost(NsdServiceInfo service) {
                 // When the network service is no longer available.
                 // Internal bookkeeping code goes here.
                 Log.e(TAG, "service lost: " + service);
             }

             @Override
             public void onDiscoveryStopped(String serviceType) {
                 Log.i(TAG, "Discovery stopped: " + serviceType);
             }

             @Override
             public void onStartDiscoveryFailed(String serviceType, int errorCode) {
                 Log.e(TAG, "Discovery failed: Error code:" + errorCode);
                 nsdManager.stopServiceDiscovery(this);
             }

             @Override
             public void onStopDiscoveryFailed(String serviceType, int errorCode) {
                 Log.e(TAG, "Discovery failed: Error code:" + errorCode);
                 nsdManager.stopServiceDiscovery(this);
             }
         };
     }

 public static void discover(){
     System.out.println("discoverServices");
     nsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
     System.out.println("oui");
     nsdManager.discoverServices("_http._tcp.", NsdManager.PROTOCOL_DNS_SD, discoveryListener);
     System.out.println("oui");

 }
     //nsdManager = (NsdManager)c.getSystemService(Context.NSD_SERVICE);

 public static String discoverDevices(Context context)throws IOException {

     System.out.println("up");
     //MusicList scan= new MusicList();
     //System.out.println("up");
     discover();
     System.out.println("up");
     return "Abdelhamid";
     }
}
4

0 回答 0