首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google OR-Tools in Intellij: UnsatisfiedLinkError

Google OR-Tools in Intellij: UnsatisfiedLinkError
EN

Stack Overflow用户
提问于 2019-11-12 20:46:04
回答 3查看 1.3K关注 0票数 3

我正在设置一个java框架,它应该使用Google OR-Tools。下面的代码编译成功,但在运行时抛出异常:

代码语言:javascript
复制
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.google.ortools.linearsolver.operations_research_linear_solverJNI.MPSolver_CLP_LINEAR_PROGRAMMING_get()I
    at com.google.ortools.linearsolver.operations_research_linear_solverJNI.MPSolver_CLP_LINEAR_PROGRAMMING_get(Native Method)
    at com.google.ortools.linearsolver.MPSolver$OptimizationProblemType.<clinit>(MPSolver.java:221)
    at Main.main(Main.java:15)

我在Windows10上使用Intellij 2018.3。我花了很多时间尝试运行,但没有成功。根据我在互联网上的发现,异常可能是由于OR-Tools所依赖的外部库链接不良和/或缺少外部库而导致的。然而,我没有解决这个问题的背景,而且Intellij也没有突出显示任何东西。知道问题出在哪里吗?

为了完成,我运行以下代码:

代码语言:javascript
复制
import com.google.ortools.linearsolver.MPObjective;
import com.google.ortools.linearsolver.MPSolver;
import com.google.ortools.linearsolver.MPVariable;

public final class Main {

  public static void main(String[] args) {

    // Create the linear solver with the GLOP backend.
    MPSolver solver =
        new MPSolver("SimpleLpProgram", MPSolver.OptimizationProblemType.GLOP_LINEAR_PROGRAMMING);

    // Create the variables x and y.
    MPVariable x = solver.makeNumVar(0.0, 1.0, "x");
    MPVariable y = solver.makeNumVar(0.0, 2.0, "y");

    System.out.println("Number of variables = " + solver.numVariables());

    // Create a linear constraint, 0 <= x + y <= 2.
    MPConstraint ct = solver.makeConstraint(0.0, 2.0, "ct");
    ct.setCoefficient(x, 1);
    ct.setCoefficient(y, 1);

    System.out.println("Number of constraints = " + solver.numConstraints());

    // Create the objective function, 3 * x + y.
    MPObjective objective = solver.objective();
    objective.setCoefficient(x, 3);
    objective.setCoefficient(y, 1);
    objective.setMaximization();

    solver.solve();

    System.out.println("Solution:");
    System.out.println("Objective value = " + objective.value());
    System.out.println("x = " + x.solutionValue());
    System.out.println("y = " + y.solutionValue());
  }
}
EN

回答 3

Stack Overflow用户

发布于 2019-11-14 21:43:55

免责声明:与其说是一个答案,不如说是一个很长的评论...

注意:我假设你使用的是github或-tools存储库,如果你使用的是二进制包,它应该大致相同……

1)您必须加载jni库,该库将加载OR-Tools C++库及其依赖项……

代码语言:javascript
复制
/** Simple linear programming example.*/
public class Main {
  static {
    System.loadLibrary("jniortools");
  }

  public static void main(String[] args) throws Exception {

2)你有没有设法运行java示例?

代码语言:javascript
复制
make run SOURCE=ortools/linear_solver/samples/SimpleLpProgram.java

参考:https://developers.google.com/optimization/introduction/java#simple_example

3)正如Kayaman所指出的,您必须传递java运行时可以找到本地库的文件夹(即JNI包装器jniortools.dll及其依赖项libortools.dll)。

如果您查看控制台日志,您将看到完整的命令行:

代码语言:javascript
复制
java -Xss2048k -Djava.library.path=lib -cp lib\sample.jar;lib\com.google.ortools.jar;lib\protobuf.jar ...\sample

它来自makefiles/Makefile.java文件:

代码语言:javascript
复制
JAVAFLAGS = -Djava.library.path=$(LIB_DIR)
...
ifeq ($(SOURCE_SUFFIX),.java) # Those rules will be used if SOURCE contain a .java file
$(CLASS_DIR)/$(SOURCE_NAME): $(SOURCE) $(JAVA_OR_TOOLS_LIBS) | $(CLASS_DIR)
    -$(DELREC) $(CLASS_DIR)$S$(SOURCE_NAME)
    -$(MKDIR_P) $(CLASS_DIR)$S$(SOURCE_NAME)
    "$(JAVAC_BIN)" -d $(CLASS_DIR)$S$(SOURCE_NAME) \
 -cp $(LIB_DIR)$Scom.google.ortools.jar$(CPSEP)$(LIB_DIR)$Sprotobuf.jar \
 $(SOURCE_PATH)
...
.PHONY: run # Run a Java program.
run: build
    "$(JAVA_BIN)" -Xss2048k $(JAVAFLAGS) \
 -cp $(LIB_DIR)$S$(SOURCE_NAME)$J$(CPSEP)$(LIB_DIR)$Scom.google.ortools.jar$(CPSEP)$(LIB_DIR)$Sprotobuf.jar \
 $(SOURCE_NAME) $(ARGS)
endif

源:https://github.com/google/or-tools/blob/46173008fdb15dae1dca0e8fa42a21ed6190b6e4/makefiles/Makefile.java.mk#L15https://github.com/google/or-tools/blob/46173008fdb15dae1dca0e8fa42a21ed6190b6e4/makefiles/Makefile.java.mk#L328-L333

注意:您可以运行make detect_java来了解标志,即LIB_DIR的值注意:如果您确实使用了预编译包,Makefile在这里:https://github.com/google/or-tools/blob/stable/tools/Makefile.cc.java.dotnet

然后,您可以尝试在Intellij中添加此选项后...

您必须理解,or-tools是一组使用SWIG生成器封装到C++中的Java本机库。

票数 0
EN

Stack Overflow用户

发布于 2020-06-05 14:05:21

要使用Intellij (在windows机器上)使其工作,您需要:

intellij安装Microsoft Visual C++ Redistributable for Visual Studio

  • In intellij,
  1. 到解压文件的lib文件夹下的2个jars中(这2个jars中的每一个都是单独的,不要添加到lib文件夹中。This is why).
  2. Add库路径到VM选项。在Intellij中,编辑您的运行配置并添加到vm选项:通过将以下代码添加到您的类中,静态地-Djava.library.path=<path to the lib folder that hold the jars>
  3. Load jni库(正如前面提到的here)。

static { System.loadLibrary("jniortools"); }

票数 0
EN

Stack Overflow用户

发布于 2021-10-04 15:53:05

在我的例子中,解决方案很简单--我只需要添加以下一行代码:

代码语言:javascript
复制
Loader.loadNativeLibraries();

加载器来自com.google.ortools.Loader的位置

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58819070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档