У меня сложная проблема с вызовом нативной функции с использованием JNI из потока.
Собственная функция — это устаревший код, выполняющий задачу, требующую больших вычислительных ресурсов. Поскольку я не хотел бы замораживать остальную часть программы, вычисления должны выполняться в фоновом потоке. EventBus используется для отправки результата расчета обратно в основную программу.
В основном это должно быть довольно простым, примерно так:
public class CalculationEngine {
private CalculationEngine(){}
public static void calculateInBackground(final Parameters parameters) {
new Thread(new Runnable() {
public void run() {
// Someone might change the parameters while our thread is running, so:
final Parameters clonedParameters = parameters.clone();
Results results = new Results();
natCalc(clonedParameters, results);
EventBus.publish("Results", results);
}
}).start();
}
public static void calculateNormally(final Parameters parameters) {
Results results = new Results();
natCalc(parameters, results);
EventBus.publish("Results", results);
}
private static native synchronized void
natCalc(Parameters parameters, Results results);
}
Теперь метод calculateNormally
, который блокирует основную программу, работает нормально, но метод calculateInBackground
, который просто создает фоновый поток для выполнения того же действия, вызывает различные сбои в собственном коде, когда он вызывается последовательно . Последовательно я имею в виду, что он вызывается снова только после того, как предыдущий поток завершился и вернул результат. Обратите внимание, что собственный код помечен synchronized
, чтобы гарантировать, что только один его экземпляр может работать одновременно.
Мой вопрос: как собственный код может вести себя по-разному в зависимости от того, вызывается ли он из основного потока или из какого-то другого потока? Это похоже на то, что нативный код сохраняет «состояние» и на самом деле не выходит, когда он вызывается из потока, отличного от основного потока. Есть ли способ «очистить» или «сбросить» поток после его завершения? В JNI & Threads должно быть что-то, чего я просто не знаю.
Спасибо за любые подсказки!