如何在 Qthread 中使用 QAndroidJniEnvironment 指针?
How to use QAndroidJniEnvironment pointer in a Qthread?
在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 中使用指向 QAndroidJniEnvironment
或 QAndroidJniObject
的指针吗?因此应用程序 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主线程中我成功可以运行这个:
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 中使用指向 QAndroidJniEnvironment
或 QAndroidJniObject
的指针吗?因此应用程序 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 环境指针。我希望这对某人有所帮助。