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);
}
}
Bu 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)
First you c code stick is not all, generally reported this error is because you are not in the UI thread operation the UI, but to you here is the print () in Java jni call this part to print a string appears to be no problem, you can check your error this thread elsewhere for operating a part of the UI. Jni error Sometimes the location of the error may not be very accurate.