【问题标题】:UnsatisfiedLinkError: no opencv_java249 in java.library.pathUnsatisfiedLinkError:java.library.path 中没有 opencv_java249
【发布时间】:2015-01-21 05:26:11
【问题描述】:

在我的 Mac 上运行一段代码时遇到了一些问题。 有人给我写了一个图像分析 java 应用程序,但我在尝试在 netbeans 上运行它时不断收到此错误。

运行:线程“主”java.lang.UnsatisfiedLinkError 中的异常:否 java.library.path 中的 opencv_java249 位于 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857) 在 java.lang.Runtime.loadLibrary0(Runtime.java:870) 在 java.lang.System.loadLibrary(System.java:1119) 在 image.prossing.Test.main(Test.java:28) Java 结果:1 构建成功 (总时间:0秒)

拥有 netbeans 项目,并添加必要的 jar 文件作为库。程序员告诉我下载正确的 OpenCV 版本并将 opencv.dll 文件复制到我的 java/jre/bin 文件夹中。但我找不到 dll 文件或 java/jre 文件夹。 我知道大多数编程发生在 Windows 上是有原因的。希望有人能帮我解决这个问题并在我的 Mac 上运行这个应用程序。

这是代码的第一部分,最有可能导致错误的部分:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package image.prossing;

/**
 *
 * @author Dumith Salinda
 */
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import static org.opencv.core.Core.FONT_HERSHEY_SIMPLEX;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Test {

public static void main(String[] args) {

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

抱歉,如果不清楚,请告诉我如果缺少或不清楚要添加什么信息。 非常感谢您提供的任何帮助。真挚地 梅尔瓦塞尔

【问题讨论】:

  • 检查如何在 JNI 中设置本地库的路径
  • 那么您是否尝试使用 Mac 的重新编译库或获取 Mac 版本,如果是,它对您有用吗?

标签: java opencv javacv


【解决方案1】:

查看您的 OpenCV 目录;

举个例子; (使用brew install opencv3 --with-java --with-python3安装)

/usr/local/Cellar/opencv3/XXX/share/OpenCV/java

你会看到的;

libopencv_javaXXX.so    opencv-XXX.jar

现在您已经编译好了 OpenCV 的 Java 原生库 (libopencv_javaXXX.so),唯一剩下的就是 mac 的 动态库

libopencv_javaXXX.so链接到libopencv_javaXXX.dylib

ln -s libopencv_javaXXX.so libopencv_javaXXX.dylib

现在将/usr/local/Cellar/opencv3/XXX/share/OpenCV/java 添加为 IntelliJ 中的 Native Library Locations 或 Eclipse 中的类似内容。

或者将此添加到您的 JVM 参数中;

-Djava.library.path=/usr/local/Cellar/opencv3/XXX/share/OpenCV/java

【讨论】:

【解决方案2】:

在运行 OSX Yosemite 的 Mac 上,我将 libopencv_java2412.dylib 文件放入 /Library/Java/Extensions 并且它可以工作。

构建opencv后,libopencv_java2412.dylib在/build/lib中生成。

【讨论】:

  • 太棒了!也适用于 El Capitan。
  • 即使在 Sierra 上。
【解决方案3】:

在花费大量时间并使用 StackOverflow 的不同建议后,我设法获得了 Windows 解决方案。但我也在为 mac 添加一个解决方案。希望它应该工作。

  1. 根据您的系统配置加载您的库。

    private static void loadLibraries() {
    
        try {
            InputStream in = null;
            File fileOut = null;
            String osName = System.getProperty("os.name");
            String opencvpath = System.getProperty("user.dir");
            if(osName.startsWith("Windows")) {
                int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
                if(bitness == 32) {
                    opencvpath=opencvpath+"\\opencv\\x86\\";
                }
                else if (bitness == 64) { 
                    opencvpath=opencvpath+"\\opencv\\x64\\";
                } else { 
                    opencvpath=opencvpath+"\\opencv\\x86\\"; 
                }           
            } 
            else if(osName.equals("Mac OS X")){
                opencvpath = opencvpath+"Your path to .dylib";
            }
            System.out.println(opencvpath);
            System.load(opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll");
        } catch (Exception e) {
            throw new RuntimeException("Failed to load opencv native library", e);
        }
    }
    

2.现在根据您的需要使用此方法

public static void main(String[] args) {
    loadLibraries();
} 

【讨论】:

  • 这个答案似乎没有回答这个问题,这不是关于Windows,而是关于Mac。另外,请解释您的代码的作用以及解决问题的原因和方式。
【解决方案4】:

以 Harsh Vakharia 的 answer 为基础,我尝试使用 macports 在我的 Mac 上安装 OpenCV:

sudo port install opencv +java
ls /opt/local/share/OpenCV/java
libopencv_java343.dylib opencv-343.jar

为了使用这个库,我希望能够在运行时修改库路径,这在

中讨论过

最后得到了以下帮助类和单元测试。该代码现在是

的一部分

Self Driving RC-Car open Source 我是项目提交者。

JUnit 测试

/**
   * @see <a href=
   *      'https://stackoverflow.com/questions/27088934/unsatisfiedlinkerror-no-opencv-java249-in-java-library-path/35112123#35112123'>OpenCV
   *      native libraries</a>
   * @throws Exception
   */
  @Test
  public void testNativeLibrary() throws Exception {
    if (debug)
      System.out.println(String.format("trying to load native library %s",
          Core.NATIVE_LIBRARY_NAME));
    assertTrue(NativeLibrary.getNativeLibPath().isDirectory());
    assertTrue(NativeLibrary.getNativeLib().isFile());
    NativeLibrary.load();
  }

NativeLibrary

package com.bitplan.opencv;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Arrays;

import org.opencv.core.Core;

/**
 * load OpenCV NativeLibrary properly
 */
public class NativeLibrary {
  protected static File nativeLibPath = new File("../lib");

  /**
   * get the native library path
   * 
   * @return the file for the native library
   */
  public static File getNativeLibPath() {
    return nativeLibPath;
  }

  /**
   * set the native library path
   * 
   * @param pNativeLibPath
   *          - the library path to use
   */
  public static void setNativeLibPath(File pNativeLibPath) {
    nativeLibPath = pNativeLibPath;
  }

  /**
   * get the current library path
   * 
   * @return the current library path
   */
  public static String getCurrentLibraryPath() {
    return System.getProperty("java.library.path");
  }

  /**
   * Adds the specified path to the java library path
   *
   * @param pathToAdd
   *          the path to add
   * @throws Exception
   * @see <a href=
   *      'https://stackoverflow.com/questions/15409223/adding-new-paths-for-native-libraries-at-runtime-in-java'>Stackoverflow
   *      question how to add path entry to native library search path at
   *      runtime</a>
   */
  public static void addLibraryPath(String pathToAdd) throws Exception {
    final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
    usrPathsField.setAccessible(true);

    // get array of paths
    final String[] paths = (String[]) usrPathsField.get(null);

    // check if the path to add is already present
    for (String path : paths) {
      if (path.equals(pathToAdd)) {
        return;
      }
    }

    // add the new path
    final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
    newPaths[newPaths.length - 1] = pathToAdd;
    usrPathsField.set(null, newPaths);
  }

  public static File getNativeLib() {
    File nativeLib = new File(getNativeLibPath(),
        "lib" + Core.NATIVE_LIBRARY_NAME + ".dylib");
    return nativeLib;
  }

  /**
   * load the native library by adding the proper library path
   * 
   * @throws Exception
   *           - if reflection access fails (e.g. in Java9/10)
   */
  public static void load() throws Exception {
    addLibraryPath(getNativeLibPath().getAbsolutePath());
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
  }

}

【讨论】:

    【解决方案5】:

    以下代码行发生异常:

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    

    您的程序试图通过调用loadLibrary 方法时的参数名称加载本机库,但它无法找到该库。确保将本机库 (opencv.dll) 放置在 java.library.path 系统属性中存在的位置之一,因为 JVM 会查看这些位置以加载任何本机库(可能不包含“java/jre/bin”)。

    您可以在您的程序中打印java.library.path,如下所示:

    System.out.println(System.getProperty("java.library.path"));
    

    【讨论】:

    • 我认为你错过了 Meir 在 Mac 上运行他的代码时试图链接到 Windows 库(.dll 文件)的观点。
    • @striving_coder 哦..是的!它不适用于 Mac 上的 .dll。 Meir 需要为 Mac 获取库。
    【解决方案6】:

    您不能只将 Windows 库(dll 文件)放在 Mac 上并让它运行 - 您需要先为 Mac 编译库(或获取库的 Mac 版本)。

    请参阅此处以获取有关如何操作的提示:

    .dll Equivalent on Mac OS X

    How do third-party libraries work in Objective-C and Xcode?

    How to use a Windows DLL with Java in Mac OS X?

    【讨论】:

      【解决方案7】:

      我建议您使用由 OpenPnP (https://github.com/openpnp/opencv) 打包的 OpenCV Java 库,而不是手动安装 OpenCV 库,其中包含所有必需的 DLL。

      除了将其添加到您的构建自动化工具配置(在我的情况下为 Gradle)并添加以下代码以加载库之外,它不需要其他步骤:

       System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
      

      【讨论】:

        【解决方案8】:

        只需将opencv_java249.dll 所在的文件夹添加到路径中即可;根据您的机器架构,它可能类似于C:\bin\opencv\build\java\x32C:\bin\opencv\build\java\x64。问题是java.library.path 实际上是path 变量。

        【讨论】:

          【解决方案9】:

          netebans 右击项目选择了 wproperti 选择运行,工作目录,点击Browser change to opencv文件夹,release/lib,

          【讨论】:

            猜你喜欢
            • 2015-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-29
            相关资源
            最近更新 更多