应用程序中的 NI 检测错误:JNI GetMethodID 被调用并带有未决异常 java.lang.RuntimeException

问题描述

我想在 Qt 平台上通过 JNI 使用 C++ 和 Java 构建一个应用程序,我尝试执行以下代码: C++

#include "musiclist.h"

#include <QAndroidIntent>
#include <QAndroidjnienvironment>
#include <QDebug>
#include <QStringList>
#include <QNetworkReply>


MusicTrack::MusicTrack(QObject *parent) : QObject(parent){}
void MusicTrack::testerJava()
{
    qDebug()<<"javatest";
    QNetworkAccessManager *manager = new QNetworkAccessManager();



      //QAndroidJniObject java("org/qtproject/example/musiclist/MusicList");

     // jint res = java.callMethod<jint>("createAp","(Landroid/content/Context)I",QtAndroid::androidContext().object());

      if (QAndroidJniObject::isClassAvailable("org/qtproject/example/musiclist/MusicList")){

          qDebug()<<"Classe trouvé";

          QAndroidjnienvironment env;
          jclass javaClass = env.findClass("org/qtproject/example/musiclist/MusicList");
          QAndroidJniObject classObject(javaClass);
          classObject.callMethod<void>("print","(Ljava/lang/String;)V","teta");}}

Java 代码

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  NsdManager.discoveryListener  discoveryListener;
      private  NsdManager nsdManager;

      //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,"discovery Failed: Error code:" + errorCode);
                 nsdManager.stopServicediscovery(this);
             }
         };
     }

 public  void discover(Context c){
     System.out.println("discoverServices");
     nsdManager = (NsdManager)c.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  void discoverDevices(Context context)throws IOException {


     System.out.println("up");
     String re="Abdelhamid";

     //System.out.println("up");
     initializediscoveryListener();
     discover(context);
     System.out.println("up");

     }

 public void print(String teta)
 {
     System.out.println(teta);
     }

}

但我遇到了以下问题:我认为这是一个错误, 艺术:art/runtime/java_vm_ext.cc:410] JNI 在应用程序中检测到错误:JNI getmethodID 调用了未决异常 java.lang.RuntimeException:无法在尚未调用 Looper.prepare() 的线程内创建处理程序 F art : art/runtime/java_vm_ext.cc:410] at void android.os.Handler.(android.os.Handler$Callback,boolean) (Handler.java:200) 艺术:art/runtime/java_vm_ext.cc:410] at void android.os.Handler.() (Handler.java:114) 艺术:art/runtime/java_vm_ext.cc:410] at void android.app.Activity.() (Activity.java:865) 艺术:art/runtime/java_vm_ext.cc:410] 在 void org.qtproject.qt5.android.bindings.QtActivity.() (QtActivity.java:94)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)