如何在 Qthread 中使用 QAndroidJniEnvironment 指针



在qt主线程中,我可以成功地运行这个:

 jbyteArray jBuffer = _env->NewByteArray(bufferSize);

_env是一个QAndroidJniEnvironment,但是如果我尝试在QRunnable的运行函数中使用_env,应用程序崩溃并发生此错误:

Fatal signal 11 (SIGSEGV), code 1

这是代码:

class HelloWorldTask : public QRunnable
{
    QAndroidJniEnvironment * _env;
    void run()
    {
        qDebug() << "Hello world from thread" << QThread::currentThread();
        jbyteArray jBuffer = (*_env)->NewByteArray(10);
        qDebug() << "Hello 2 world from thread" << QThread::currentThread();
    }
public:
    void setPointer(QAndroidJniEnvironment * p){
        _env = p;
    }
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    HelloWorldTask * hello = new HelloWorldTask();
    QAndroidJniEnvironment env;
    QAndroidJniEnvironment * p = & env;
    hello->setPointer(p);
    QThreadPool::globalInstance()->start(hello);
    return a.exec();
}

您能否告诉我如何在新的 Qthread 中使用指向QAndroidJniEnvironmentQAndroidJniObject的指针? 因此,应用程序 UI 在执行 Java 过程中保持响应。

到目前为止,

只有15人读过这个问题。仍然没有答案。这是一个非常困难或非常容易回答的问题!!无论如何,我在qt论坛用户的帮助下找到了解决方案。这是工作代码:

class HelloWorldTask : public QRunnable
{
    QAndroidJniEnvironment * _env;
    void run()
    {
        JNIEnv * jniEnv;
        JavaVM * jvm = _env->javaVM();
        qDebug() << "Getting jni environment";
        jvm->GetEnv(reinterpret_cast<void**>(&_env), JNI_VERSION_1_6);
        qDebug() << "Attaching current thread";
        jvm->AttachCurrentThread(&jniEnv,NULL);
        qDebug() << "Creating byte array" ;
        jbyteArray jBuffer = jniEnv->NewByteArray(10);
        qDebug() << "byte array created" ;
        jvm->DetachCurrentThread();
    }
public:
    void setPointer(QAndroidJniEnvironment * p){
        _env = p;
    }
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    HelloWorldTask * hello = new HelloWorldTask();

    QAndroidJniEnvironment * env;
    hello->setPointer(env);
    // QThreadPool takes ownership and deletes 'hello' automatically
    QThreadPool::globalInstance()->start(hello);
    return a.exec();
}

您应该调用 AttachCurrentThread 以在另一个线程中使用 jni 环境指针。我希望这对某人有所帮助。

相关内容

  • 没有找到相关文章

最新更新