Google OR-Tools: Could not run the java example, java.lang.UnsatisfiedLinkError: no jniortools in java.library.path

Google OR-Tools: Could not run the java example, java.lang.UnsatisfiedLinkError: no jniortools in java.library.path

我是 java 的新手,我想尝试 google or-tools for vehicle routing problem

只需尝试 运行 java 来自 here

的示例

但是我得到了这个例外:java.lang.UnsatisfiedLinkError: no jniortools in java.library.path

有一行代码加载系统库"jniortools"。但我不知道从哪里获得该库。

我正在使用 mac osx。

有什么想法吗?

OR-Tools 是一个 C++ 库,在 Java 中使用 SWIG(执行 JNI 调用等...)进行包装。 IE。这是一个原生库,不是 "pure" java 库...

因此,要在 java 中使用 ortools,您必须调整 java.library.path 例如当使用来自源代码的 ortools 和 运行 来自 root_dir 的程序时:

make third_party
make java
java -Djava.library.path=lib -cp objs:lib/com.google.ortools.jar:lib/protobuf.jar Program

注意:ortools依赖于protobuf.jar(由ortools makefile third_party目标规则编译)

文档:https://developers.google.com/optimization/introduction/run_programs#running-the-java-example

自发布 v7.8(或使用 master 分支)后,您可以使用基于 CMake 的构建生成 Maven 包。

git clone --depth=1 --single-branch -b master git@github.com:google/or-tools.git
cd or-tools
cmake -S. -Bbuild -DBUILD_JAVA=ON
cmake --build build -v

然后你将在 build/java/ortools-javabuild/java/ortools-<native> 中拥有 maven 包(这是两个常规的 maven 项目...)

我们使用 Gradle 进行构建,Linux OS。这些是我们为解决此问题所遵循的步骤

  • 在应用程序的主程序中添加这行代码class。

     System.loadLibrary("jniortools");
    
  • 下载 linux 的 OR Tools jar 文件并将它们保存在项目的任意文件夹中。 (在这里,它是 <project_folder>/libs )。并将这些行添加到您的 build.gradle 文件

    compile files('libs/ortools-java-8.1.8487.jar')
    
    compile files('libs/ortools-linux-x86-64-8.1.8487.jar')
    
    compile group: 'net.java.dev.jna', name: 'jna', version: '5.6.0'
    
  • 此外,我们还解压了 jar ortools-linux-x86-64-8.1.8487.jar 在同一文件夹 ( libs )

    jar -xvf ortools-linux-x86-64-8.1.8487.jar
    
  • 虽然 运行 应用程序(将其构建为 jar 文件后),我们提到了 .so 文件所在的本机库路径

    java -Djava.library.path="/home/user/<project_name>/libs/linux-x86-64/" -jar /home/user/<project_name>/build/libs/<project_name>.jar
    

为了澄清 Rohith Rajesh 的回答,可以在“ortools-(platform)-(version).jar”文件中找到所需的 jniortools 库。对于 mac osx,它以“libjniortools.dylib”文件的形式存在。

您只需要提取 jar 并通过 java 个参数指向它(参见 Rohith Rajesh 的回答)