스레드에서 JNI를 사용하여 네이티브 함수를 호출하는 데 어려움을 겪고 있습니다.시간이 많이 걸리는 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에 뭔가가 있어야합니다. & 간단히 알 수없는 스레드.
어떤 힌트를 주셔서 감사합니다!
답변으로 추가 하시겠습니까? _ 실제 해결책이므로 매우 유용합니다. –
좋은 아이디어. 이제 대답입니다. –