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