调用QT/C 的非静态Java方法



我试图从qt/c 调用我自己的Java类的非静态方法,但我会收到以下错误:

w System.err:java.lang.nosuchmethoderror:无静态方法" lorg/qtproject/qt5/qt5/android/bindings/qtactivity; .callnative((v;"(

这是Java类的代码:

package com.ieio.finger;

import static java.lang.System.out;
public class Finger extends org.qtproject.qt5.android.bindings.QtActivity {
    public void callNative()
        {
            System.out.println("I am in Java");
        }
}

在这里C 代码Finger.h

#ifndef FINGER_H
#define FINGER_H
#include <QObject>
class finger : public QObject
{
    Q_OBJECT
public:
    explicit finger(QObject *parent = nullptr);
    Q_INVOKABLE void call_java();
signals:
public slots:
};
#endif // FINGER_H

Finger.cpp:

#include <QtAndroidExtras/QAndroidJniObject>
#include <QtAndroidExtras/QtAndroid>
#include "finger.h"

finger::finger(QObject *parent) : QObject(parent)
{
}
void finger::call_java()
{
    qDebug()<< "call java";
    QtAndroid::androidActivity().callObjectMethod("callNative","()V;");
    qDebug()<< "called java";
}

main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <finger.h>
    int main(int argc, char *argv[])
    {    
        QGuiApplication app(argc, argv);
        QQmlApplicationEngine engine;
        qmlRegisterType<finger>("io.qt.ieio.finger", 1, 0, "Finger");
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
        return app.exec();
    }

和qml:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import io.qt.ieio.finger 1.0
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Finger
    {
        id:myFinger
    }
    Button {
        id: button
        x: 234
        y: 284
        text: qsTr("Button")
        onClicked: {
            myFinger.call_java()
        }
    }
}

有什么想法为什么我得到 java.lang.nosuchmethoderror

最终我找到了一个解决方案:我更改了方法:

void finger::call_java()
{
    qDebug()<< "call java";
    QtAndroid::androidActivity().callObjectMethod("callNative","()V;");
    qDebug()<< "called java";
}

void finger::call_java()
{
    qDebug()<< "call java";
    QtAndroid::runOnAndroidThread([]{
        QAndroidJniObject myJavaObject("com/ieio/finger/Finger");
        myJavaObject.callMethod<void>("callNative","()V");
    });
    qDebug()<< "called java";
}

最新更新