web-dev-qa-db-ja.com

UnsatisfiedLinkError:Java.library.pathにopencv_Java249はありません

私のMacでコードを実行する際に問題が発生します。誰かが私に画像分析を書いていたJava appですが、netbeansで実行しようとするとこのエラーが発生し続けます。

実行:スレッド「メイン」の例外Java.lang.UnsatisfiedLinkError:Java.lang.Runtime.loadLibrary0(Runtime.Java: 870)at Java.lang.System.loadLibrary(System.Java:1119)at image.prossing.Test.main(Test.Java:28)Java Result:1 BUILD SUCCESSFUL(合計時間) :0秒)

Netbeansプロジェクトを用意し、必要なjarファイルをライブラリーとして追加します。プログラマーは、正しいOpenCVバージョンをダウンロードし、opencv.dllファイルをJava/jre/binフォルダーにコピーするように言った。しかし、dllファイルまたはJava/jreフォルダーが見つかりません。私はほとんどのプログラミングが理由でウィンドウで起こることを知っています。誰かが私がこの問題を解決し、このアプリケーションを私の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);

明確でない場合は申し訳ありませんが、不足している場合や不明な場合に追加する情報をお知らせください。あなたができるどんな助けでも本当に感謝します。よろしくお願いします

15
Meir

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.solibopencv_javaXXX.dylibにリンクします。

ln -s libopencv_javaXXX.so libopencv_javaXXX.dylib

/usr/local/Cellar/opencv3/XXX/share/OpenCV/Javaネイティブライブラリの場所 inIntelliJまたはEclipseの類似のものとして追加します。

または、これをJVM引数に追加します。

-Djava.library.path=/usr/local/Cellar/opencv3/XXX/share/OpenCV/Java
17
Harsh Vakharia

OSX Yosemiteを実行しているMacで、libopencv_Java2412.dylibファイルを/Library/Java/Extensionsにドロップし、機能しました。

Opencvをビルドすると、libopencv_Java2412.dylibが/ build/libに生成されます。

8
BatteryAcid

多くの時間を費やし、StackOverflowからのさまざまな提案を使用した後、私は何とかWindows向けのソリューションを手に入れました。しかし、私は同様にMac用のソリューションを追加しています。それが機能することを願っています。

  1. システム構成に従ってlibをロードします。

    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();
} 
3
Kuldeep Kala

過酷なVakhariaのビルド answer Macポートを使用して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);
  }

}
2
Wolfgang Fahl

以下のコード行から例外が発生しています:

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"));
2
sjain

Windowsライブラリ(dllファイル)をMacに配置して実行することはできません。最初にMac用のライブラリをコンパイルする(またはMacバージョンのライブラリを取得する)必要があります。

方法のヒントについては、こちらをご覧ください。

Mac OS Xでは.dllと同等

Objective-CとXcodeでサードパーティのライブラリはどのように機能しますか?

Windowsの使用方法DLL with Java?

1
striving_coder