«Недопустимая инструкция: 4» из приложения JNI в macOS 10.13.6 - PullRequest
2 голосов
/ 13 марта 2020

Я пытаюсь использовать 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!

Если библиотеке требуется увеличенный размер стека, мне это кажется понятным. Однако очень неудобно, что приложение просто аварийно завершает работу и не дает мне возможности отреагировать на эту проблему (например, с помощью исключения).

  1. Это предполагаемое поведение библиотеки JNI звонки, если они сталкиваются с проблемами или ошибкой?
  2. В любом случае: существует ли обходной путь или исправление, которое позволило бы мне реагировать на эту проблему?

Ради Полнота, это версии участвующих частей программного обеспечения:

  • macOS 10.13.6
  • OpenJDK 1.8.0_242
  • OR-Tools 7.5.7466
  • Xcode 10.1
...