Java Google或Intellij中的工具:未满足链接错误

Java Google或Intellij中的工具:未满足链接错误,java,or-tools,intellij-13,Java,Or Tools,Intellij 13,我正在建立一个java框架,应该使用Google或其他工具。下面的代码编译成功,但在运行时引发异常: 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.linear

我正在建立一个java框架,应该使用Google或其他工具。下面的代码编译成功,但在运行时引发异常:

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)
线程“main”java.lang.UnsatisfiedLinkError:com.google.ortools.linearsolver.operations\u research\u linear\u solverJNI.MPSolver\u CLP\u linear\u PROGRAMMING\u get()中出现异常 在com.google.ortools.linearsolver.operations\u research\u linear\u solverJNI.MPSolver\u CLP\u linear\u PROGRAMMING\u get(本机方法) 位于com.google.ortools.linearsolver.MPSolver$OptimizationProblemType。(MPSolver.java:221) Main.Main(Main.java:15) 我正在Windows 10上使用Intellij 2018.3。我花了很多时间试着跑,但没有成功。根据我在互联网上的发现,这个异常可能是由于链接不良和/或缺少工具所依赖的外部库造成的。然而,我没有解决这个问题的背景,Intellij也没有强调任何东西。知道问题出在哪里吗

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

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());
  }
}
import com.google.ortools.linearsolver.MPObjective;
导入com.google.ortools.linearsolver.MPSolver;
导入com.google.ortools.linearsolver.MPVariable;
公开期末班{
公共静态void main(字符串[]args){
//使用GLOP后端创建线性解算器。
MPS解算器=
新的MPSolver(“SimpleLProgram”,MPSolver.OptimizationProblemType.GLOP_线性规划);
//创建变量x和y。
MPVariable x=solver.makeNumVar(0.0,1.0,“x”);
MPVariable y=solver.makeNumVar(0.0,2.0,“y”);
System.out.println(“变量数=“+solver.numVariables());

//创建一个线性约束,0免责声明:与其说是答案,不如说是一个长评论

注意:我假设您使用的是github存储库或工具,如果您使用的是二进制软件包,那么它应该或多或少是相同的

1)必须加载JNI库,它将加载或工具C++库及其依赖项…

/**简单线性规划示例*/
公共班机{
静止的{
系统加载库(“jniortools”);
}
公共静态void main(字符串[]args)引发异常{
2) 您是否成功运行了java示例

make run SOURCE=ortools/linear_solver/samples/SimpleLpProgram.java
参考:

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

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

java-Xss2048k-Djava.library.path=lib-cp lib\sample.jar;lib\com.google.ortools.jar;lib\protobuf.jar…\sample
它来自makefiles/Makefile.java文件:

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
src: 和

注意:您可以运行
make detect_java
来了解标志,即LIB_DIR的值 注意:如果您确实使用了预编译包,则生成文件如下所示:

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


<>你必须理解,或者工具是使用SWIG生成器将java C++封装到Java的一组原生库。

< p>免责声明:比注释更冗长的注释…< /P> 注意:我假设您使用的是github存储库或工具,如果您使用的是二进制软件包,那么它应该或多或少是相同的

1)必须加载JNI库,它将加载或工具C++库及其依赖项…

/**简单线性规划示例*/
公共班机{
静止的{
系统加载库(“jniortools”);
}
公共静态void main(字符串[]args)引发异常{
2) 您是否成功运行了java示例

make run SOURCE=ortools/linear_solver/samples/SimpleLpProgram.java
参考:

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

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

java-Xss2048k-Djava.library.path=lib-cp lib\sample.jar;lib\com.google.ortools.jar;lib\protobuf.jar…\sample
它来自makefiles/Makefile.java文件:

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
src: 和

注意:您可以运行
make detect_java
来了解标志,即LIB_DIR的值 注意:如果您确实使用了预编译包,则生成文件如下所示:

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


<> P>必须理解,或者工具是使用SWIG生成器将Java封装到java的一组C++原生库。

< P>使它使用INTLLIJ(Windows机器)工作,你需要:

  • 安装
  • 下载并解压缩
  • 在intellij中,指向解压缩文件的lib文件夹下的2个jar(2个jar中的每一个都单独添加到lib文件夹本身)
  • 将库路径添加到VM选项。在Intellij中,编辑运行配置并添加到VM选项:
    -Djava.library.path=
  • 通过向类中添加以下代码(如上所述),静态加载jni库

    静态{
    系统加载库(“jniortools”);
    }


  • 要使用Intellij(通过windows计算机)使其正常工作,您需要:

  • 安装
  • 下载并解压缩
  • 在intellij中,指向解压缩文件的lib文件夹下的2个jar(2个jar中的每一个都单独添加到lib文件夹本身)
  • 将库路径添加到VM选项。在Intellij中,编辑运行配置并添加到VM选项:
    -Djava.library.path=
  • 通过向类中添加以下代码(如上所述),静态加载jni库

    静态{
    系统加载库(“jniortools”);
    }


  • 您丢失了本机库文件(DLL)。谢谢。我如何包含它?我可以直接在Intellij中这样做吗?还是我必须自己在internet上查找它?我刚刚做了一次搜索,我唯一能够遵循的文档是Google的官方文档,但该文档假定Visual Studio是IDE。好吧,搜索一下