2

qtメインスレッドで、これを正常に実行できます:

 jbyteArray jBuffer = _env->NewByteArray(bufferSize);

_envですQAndroidJniEnvironment_envの run 関数で使用しようとするQRunnableと、アプリケーションがクラッシュし、次のエラーが発生します。

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();
}

QAndroidJniEnvironmentまたはQAndroidJniObject新しい Qthreadへのポインターを使用する方法を教えてください。そのため、Java プロセスの実行中、アプリケーションの UI は応答し続けます。

4

1 に答える 1

2

これまでにこの質問を読んだのは 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();
}

別のスレッドで jni 環境ポインターを使用するには、AttachCurrentThread を呼び出す必要があります。これが誰かに役立つことを願っています。

于 2015-03-15T12:40:36.067 に答える