Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Qthread中使用QAndroidJniEnvironment指针?_Qt_Qthread_Qtandroidextras - Fatal编程技术网

如何在Qthread中使用QAndroidJniEnvironment指针?

如何在Qthread中使用QAndroidJniEnvironment指针?,qt,qthread,qtandroidextras,Qt,Qthread,Qtandroidextras,在qt主线程中,我可以成功运行以下命令: jbyteArray jBuffer = _env->NewByteArray(bufferSize); \u env是一个QandroidjnienEnvironment。但是,如果我尝试在QRunnable的run函数中使用\u env,则应用程序会崩溃,并出现以下错误: Fatal signal 11 (SIGSEGV), code 1 代码如下: class HelloWorldTask : public QRunnable {

在qt主线程中,我可以成功运行以下命令:

 jbyteArray jBuffer = _env->NewByteArray(bufferSize);
\u env
是一个
QandroidjnienEnvironment
。但是,如果我尝试在
QRunnable
的run函数中使用
\u 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();
}
类HelloWorldTask:公共QRunnable
{
QAndroidJniEnvironment*\u env;
无效运行()
{

qDebug()到目前为止,只有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();
}
类HelloWorldTask:公共QRunnable
{
QAndroidJniEnvironment*\u env;
无效运行()
{
JNIEnv*JNIEnv;
JavaVM*jvm=_env->JavaVM();
qDebug()GetEnv(重新解释cast(&&u env),JNI_版本1_6);
qDebug()AttachCurrentThread(&jniEnv,NULL);
qDebug()新字节数组(10);
qDebug()拆下CurrentThread();
}
公众:
void setPointer(QandroidjnienEnvironment*p){
_env=p;
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
HelloWorldTask*hello=新建HelloWorldTask();
Qandroidjnien环境*env;
hello->setPointer(env);
//QThreadPool获得所有权并自动删除“hello”
QThreadPool::globalInstance()->start(hello);
返回a.exec();
}

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

QAndroidJniEnvironment会将它创建的线程附加到QAndroidJniEnvironment上(如果需要),所以您不应该在线程之间移动它。如果您需要附加另一个线程,只需在该线程上创建一个新的QAndroidJniEnvironment实例。QAndroidJniEnvironment*env;此处使用的未初始化指针:_env->javaVM();这段代码真的运行吗?