Обновление пользовательского интерфейса из фонового потока с использованием полностью собственного кода (без JNI)?

Я пишу приложение для Android, которое выполняет большую часть обработки в фоновом потоке. Расчеты выполняются в машинном коде с использованием C ++. Я хочу обновить пользовательский интерфейс частичными результатами во время расчетов.

Я могу сделать это через JNI, а именно установить ссылку на объект UI в java, а затем вызвать метод этого объекта из собственного кода через JNI. Я ищу более эффективное решение без каких-либо вызовов JNI в части рендеринга (базовая настройка и точка входа активации должны быть на java).

Можно ли полностью изменить поток выполнения с фонового на пользовательский интерфейс в машинном коде без использования JNI (только в части рендеринга)?

Спасибо за ваши ответы. Очень признателен.

РЕДАКТИРОВАТЬ: Я подумываю об использовании OpenGL для рендеринга рассчитанного содержимого (типа видеокадров), на мой взгляд. В этом случае я, вероятно, захочу использовать метод eglSwapBuffers () , который доступен в библиотеке EGL начиная с 2.3. Самая большая проблема, я думаю, заключается в том, как легко переключиться с фонового «вычислительного» потока на «открытый GL» поток пользовательского интерфейса в машинном коде без накладных расходов JNI. Чтобы вы посоветовали? Спасибо за вашу помощь!

ПСЕВДОКОД: Вот какой-то псевдокод, который помогает проиллюстрировать, чего я хочу здесь достичь. Это больше похоже на проблему с потоками, но в игру вступает и фреймворк Android.

// background thread
void Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz)
{
    //long calculation
    struct result * res = calculate();

    //want to update ui using opengl on ui thread
    updateGL(res);
}


//want to run it on ui thread as opengl can be run only on ui thread
void updateGL(struct result * res)
{
    //some opengl code with "res"
    someGLcodeWithResult(res);

    //render surface
    eglSwapBuffers();
}

РЕДАКТИРОВАТЬ 2: По мере того, как награда постепенно приближается к концу, еще одно разъяснение. Вышеупомянутый метод updateGL можно вызвать несколькими способами. Наиболее типичным является использование GLSurfaceView в java-коде. Для этого потребуется установить средство визуализации ( setRenderer () ), а затем переопределить onDrawFrame некоторым кодом для вызова JNI / собственного уровня. Таким образом, для каждого визуализируемого кадра выполняется один вызов JNI.

Я бы хотел немного по-другому сделать рендеринг. Я хочу вызвать updateGL вообще без использования кода java / JNI и использовать только собственный уровень (как показано в отрывке выше). Самая большая проблема для меня сейчас заключается в том, как запустить updateGL в потоке пользовательского интерфейса (требуется OpenGL) без обратного вызова java. Это вообще возможно?

5
задан youri 4 January 2012 в 18:23
поделиться