web-dev-qa-db-fra.com

UnsatisfiedLinkError: pas d'opencv_Java249 dans Java.library.path

Je rencontre des problèmes pour exécuter un morceau de code sur mon Mac. Quelqu'un m'a écrit une analyse d'image Java app mais j'obtiens toujours cette erreur en essayant de l'exécuter sur des netbeans.

exécuter: exception dans le thread "principal" Java.lang.UnsatisfiedLinkError: no opencv_Java249 dans Java.library.path à Java.lang.ClassLoader.loadLibrary (ClassLoader.Java:1857) à Java.lang.Runtime.loadLibrary0 (Runtime.Java: 870) sur Java.lang.System.loadLibrary (System.Java:1119) sur image.prossing.Test.main (Test.Java:28) Java Résultat: 1 BUILD SUCCESSFUL (temps total) : 0 secondes)

Avoir le projet netbeans et ajouter les fichiers jar nécessaires en tant que bibliothèques. Le programmeur m'a dit de télécharger la bonne version d'OpenCV et de copier le fichier opencv.dll dans mon dossier Java/jre/bin. Mais je ne trouve pas le fichier dll ou le dossier Java/jre. Je sais que la plupart des programmes se produisent sur Windows pour une raison. J'espère que quelqu'un pourra m'aider à résoudre ce problème et exécuter cette application sur mon Mac.

Voici la première partie du code, la partie qui crée probablement l'erreur:

/*
 * 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);

Désolé si ce n'est pas si clair, faites-moi savoir quelles informations ajouter si quelque chose manque ou n'est pas clair. J'apprécierais vraiment toute aide que vous pourriez apporter. Sincèrement Meir Warcel

15
Meir

Regardez dans votre répertoire OpenCV;

Pour un exemple ceci; (installé à l'aide de brew install opencv3 --with-Java --with-python3)

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

Tu verras;

libopencv_javaXXX.so    opencv-XXX.jar

Maintenant que vous avez déjà la bibliothèque native d'OpenCV pour Java (libopencv_javaXXX.so) compilé avec vous, la seule chose qui reste est la bibliothèque dynamique de mac de mac .

Lien libopencv_javaXXX.so à libopencv_javaXXX.dylib;

ln -s libopencv_javaXXX.so libopencv_javaXXX.dylib

Maintenant, ajoutez /usr/local/Cellar/opencv3/XXX/share/OpenCV/Java as Native Library Locations in IntelliJ ou quelque chose de similaire dans Eclipse.

Ou ajoutez ceci à vos arguments JVM;

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

Sur un Mac exécutant OSX Yosemite, j'ai déposé le fichier libopencv_Java2412.dylib dans /Library/Java/Extensions et cela a fonctionné.

Après avoir créé opencv, libopencv_Java2412.dylib est généré dans/build/lib.

8
BatteryAcid

Après avoir passé beaucoup de temps et en utilisant différentes suggestions de StackOverflow, j'ai réussi à obtenir une solution pour Windows. mais j'ajoute également une solution pour mac. j'espère que cela devrait fonctionner.

  1. Chargez votre bibliothèque selon la configuration de votre système.

    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. utilisez maintenant cette méthode selon vos besoins

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

En s'appuyant sur Harsh Vakharia réponse j'ai essayé d'installer OpenCV sur mon mac avec macports:

Sudo port install opencv +Java
ls /opt/local/share/OpenCV/Java
libopencv_Java343.dylib opencv-343.jar

Pour utiliser cette bibliothèque, j'espérais pouvoir modifier le chemin de la bibliothèque au moment de l'exécution qui a été discuté dans

Et nous nous sommes retrouvés avec la classe d'assistance et le test unitaire suivants. Le code fait maintenant partie du

Self Driving RC-Car open Source projet dans lequel je suis un comitter.

Test 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

Une exception se produit à partir de la ligne de code ci-dessous:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Votre programme tente de charger une bibliothèque native par le nom de l'argument dans l'appel à la méthode loadLibrary, qu'il n'est pas en mesure de localiser. Assurez-vous que la bibliothèque native (opencv.dll) est placée à l'un des emplacements présents dans Java.library.path propriété système lorsque la JVM examine ces emplacements pour charger une bibliothèque native (qui pourrait ne pas contenir 'Java/jre/bin').

Vous pouvez imprimer Java.library.path dans votre programme comme ci-dessous:

System.out.println(System.getProperty("Java.library.path"));
2
sjain

Vous ne pouvez pas simplement mettre la bibliothèque Windows (fichier dll) sur Mac et l'exécuter - vous devez d'abord compiler la bibliothèque pour Mac (ou obtenir la version Mac de la bibliothèque).

Veuillez voir ici pour des conseils sur la façon de le faire:

. dll équivalent sur Mac OS X

Comment fonctionnent les bibliothèques tierces dans Objective-C et Xcode?

Comment utiliser un Windows DLL avec Java sous Mac OS X?

1
striving_coder