У меня сложная проблема с вызовом нативной функции с использованием 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 должно быть что-то, чего я просто не знаю.
Спасибо за любые подсказки!