UnsatisfiedLinkError: no opencv_java249 in java.library.path

后端 未结 9 1446
旧巷少年郎
旧巷少年郎 2020-11-27 05:38

Running into some problems making a piece of code run on my mac. Had someone write me an image analysis java app but I keep getting this error when trying to run it on netbe

相关标签:
9条回答
  • 2020-11-27 06:02

    On a mac running OSX Yosemite, I dropped the libopencv_java2412.dylib file into /Library/Java/Extensions and it worked.

    After you build opencv, the libopencv_java2412.dylib is generated in /build/lib.

    0 讨论(0)
  • 2020-11-27 06:02

    After Spending a lots of time , and using different suggestions from StackOverflow I managed to get solution for windows. but I am adding a solution for mac as well. hope it should work.

    1. Load your lib as per your system configuration.

      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.now use this method as per your need

    public static void main(String[] args) {
        loadLibraries();
    } 
    
    0 讨论(0)
  • 2020-11-27 06:02

    Building on Harsh Vakharia's answer i tried installing OpenCV on my mac with macports:

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

    To use this library I was hoping to be able to modify the library path at runtime which was discussed in

    • Adding new paths for native libraries at runtime in Java

    And ended up with the following helper class and unit test. The code is now part of the

    Self Driving RC-Car open Source project in which I am a comitter.

    JUnit Test

    /**
       * @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);
      }
    
    }
    
    0 讨论(0)
  • 2020-11-27 06:06

    Just add into the path the folder where your opencv_java249.dll is; it would be something like C:\bin\opencv\build\java\x32 or C:\bin\opencv\build\java\x64 depending of your machine architecture. The problem is that java.library.path is actually the path variable.

    0 讨论(0)
  • 2020-11-27 06:11

    netebans right klick project chosew properti chose run, working direktory, click Browser change to opencv folder, release/lib,

    0 讨论(0)
  • 2020-11-27 06:12

    Exception is occurring from below line of code:

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    

    Your program is trying to load a native library by the name of argument in call to loadLibrary method, which it is not able to locate. Make sure that native library (opencv.dll) is placed at one of the locations present in java.library.path system property as JVM looks at these locations for loading any native library (which might not contain 'java/jre/bin').

    You can print java.library.path in your program like below:

    System.out.println(System.getProperty("java.library.path"));
    
    0 讨论(0)
提交回复
热议问题