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

Emit is not working when calling on a separate android thread



  • Hey. Sorry for my english.

    There is a code that running on android on a separate Thread (Java Code) like this:

    @
    public class ClientThread extends Thread
    {
    public void run()
    {
    MainActivity.nativeMethod(); // not working
    }
    }

    public class MainActivity extends QtActivity
    {
    private static final String TAG = "MainActivity";
    private static MainActivity _instance = null;
    private static ClientThread _clientThread = null;

    public MainActivity()
    {
        _instance = this;
    }
    
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    
        nativeMethod(); // working
    
        _clientThread = new ClientThread();
        _clientThread.start();
    
    }
    
    public static native void nativeMethod();
    

    }@

    And there is C++ bridge for that:

    @class TestObject : public QObject
    {
    Q_OBJECT

    public:
    explicit TestObject(QObject *parent = 0);
    static TestObject *getInstance();

    Q_SIGNALS:
    void nativeMethod();

    public Q_SLOTS:

    };

    static void jniNativeMethod(JNIEnv *, jclass)
    {
    qDebug() << "works threaded or non-threaded calls"
    emit TestObject::getInstance()->nativeMethod();
    }@

    Also a QML connection:

    @import TestObjectPackage 1.0

    Connections
    {
    target: TestObjectPackage.testObjectInstance
    onNativeMethod:
    {
    console.log("QML received signal!");
    }
    }@

    jniNativeMethod calls every time but emit not sending signal to QML on sepearate thread. Could you help me?



  • I wonder if the problem is due to the use of a static signal.

    Cross-thread signal delivery uses an event loop in the receiving thread. Intra-thread delivery is a direct call by default. The static use might confuse the detection of the correct connection type.


Log in to reply