qt - 如何在Qthread中使用QAndroidJniEnvironment指针?

标签 qt qthread qtandroidextras

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

 jbyteArray jBuffer = _env->NewByteArray(bufferSize);

_env 是一个QAndroidJniEnvironment。但如果我尝试在 QRunnable 的 run 函数中使用 _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 环境指针。我希望这对某人有帮助。

关于qt - 如何在Qthread中使用QAndroidJniEnvironment指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29057981/

相关文章:

c++ - 如何在不使应用程序崩溃的情况下使上下文菜单消失?

qt - Qt 桌面和嵌入式应用程序中的文本大小和样式不同

qt - .pro 文件中的未知模块 - 无法构建包含 androidextras 模块的应用程序

android - 错误 : undefined reference to '_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*)'

android - Android 上的 QML - C++ 适用于业务逻辑吗?

c++ - Qt FramelessWindowHint 和 WA_TranslucentBackground 字体渲染

c++ - OpenGL 纹理未显示(纯色而不是纹理)或显示有伪影

python - 传感器读取覆盆子数据

qt - QThreadPool 中的 QVector::clear 和 QFile::close

python - 为什么 PyQt 在没有信息的情况下崩溃? (退出代码 0xC0000409)