Я пытаюсь использовать Google OR-Tools из приложения Java на macOS. Поэтому я скопировал папку lib
из официального двоичного файла в мой рабочий каталог. Попытка выполнить следующую программу завершается неудачно с сообщением об ошибке Illegal instruction: 4
и кодом выхода 132
, однако:
import com.google.ortools.linearsolver.MPSolver;
import com.google.ortools.linearsolver.MPVariable;
public class MWE {
static {
System.loadLibrary("jniortools");
}
public static void main(String[] args) {
MPSolver solver = new MPSolver("Solver",
MPSolver.OptimizationProblemType.CBC_MIXED_INTEGER_PROGRAMMING);
MPVariable x = solver.makeBoolVar("x");
System.out.println("Calling solver.solve()...");
final MPSolver.ResultStatus resultStatus = solver.solve();
System.out.println("Done!");
}
}
Вывод, который я получаю, следующий:
$ javac -cp lib/com.google.ortools.jar:lib/protobuf.jar:. MWE.java
$ java -Djava.library.path=lib -cp lib/com.google.ortools.jar:lib/protobuf.jar:. MWE
Calling solver.solve()...
Illegal instruction: 4
Добавление -Xss2048k
к вызову java
решает проблему:
$ java -Xss2048k -Djava.library.path=lib -cp lib/com.google.ortools.jar:lib/protobuf.jar:. MWE
Calling solver.solve()...
Done!
Если библиотеке требуется увеличенный размер стека, мне это кажется понятным. Однако очень неудобно, что приложение просто аварийно завершает работу и не дает мне возможности отреагировать на эту проблему (например, с помощью исключения).
- Это предполагаемое поведение библиотеки JNI звонки, если они сталкиваются с проблемами или ошибкой?
- В любом случае: существует ли обходной путь или исправление, которое позволило бы мне реагировать на эту проблему?
Ради Полнота, это версии участвующих частей программного обеспечения:
- macOS 10.13.6
- OpenJDK 1.8.0_242
- OR-Tools 7.5.7466
- Xcode 10.1