我想在 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, 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);
}
}
但是我遇到了以下问题:我认为这是一个错误编译,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没有调用 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)