Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.RuntimeException



  • Hi All,
    I want to build an app using C++ and Java by JNI in the platform of Qt, I tried to do the code below: 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 code:

    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, int errorCode) {
                     Log.e(TAG, "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);
         }
    
    }
    

    *But I got the problem below: I thins it's an error complation, F art : art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() F art : art/runtime/java_vm_ext.cc:410] at void android.os.Handler.(android.os.Handler$Callback, boolean) (Handler.java:200) F art : art/runtime/java_vm_ext.cc:410] at void android.os.Handler.() (Handler.java:114) F art : art/runtime/java_vm_ext.cc:410] at void android.app.Activity.() (Activity.java:865) F art : art/runtime/java_vm_ext.cc:410] at void org.qtproject.qt5.android.bindings.QtActivity.() (QtActivity.java:94)

    java*


Log in to reply