Я пишу приложение для 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. Это вообще возможно?