В моем приложении Android NDK библиотека C++ работает в другом потоке, чем поток ui. Вызов JNI из C++ создает экземпляр класса Java Foo. Я хотел бы иметь еще одну панель объектов Java, созданную в потоке пользовательского интерфейса, для вызова методов на Foo. Как мне это сделать?Android/Java: Как вызвать методы объекта, созданные в другом потоке?
Difficulty bonus: Foo имеет несколько собственных методов, которые вызывают соответствующие функции JNI из библиотеки C++. Как обеспечить, чтобы эти вызовы были потокобезопасными?
Сопротивление сложности 2: Некоторые из методов Бар фактически перекрывают методы обратного вызова, в частности WebViewClient. Код возврата некоторых методов зависит от результата вызова метода Foo. Таким образом, звонок в Foo должен был произойти немедленно.
Фактически, вся конструкция, в которой требуются синхронные результаты из потока, вероятно, воняет. Если библиотека JNI не является устаревшей или третьей стороной, рассмотрите возможность перемещения Foo в поток пользовательского интерфейса. –
Вы, вероятно, должны начать с игнорирования того факта, что методы вызывают через JNI. Проблемы безопасности нитей не сильно зависят от того, какой язык программирования вы используете. – fadden
Трудность 3! Все это является частью кросс-платформенной библиотеки. Клиент в основном использует интерфейс C++, который на Android работает в другом потоке, чем пользовательский интерфейс.Эта часть дизайна является неизменной и недоступной для меня. Отсюда и трудность в реализации этого. – djcouchycouch