全网首发:Linux自带opencv库的JAVA调用失败/java.lang.UnsatisfiedLinkError:libopencv_ml.so.405: 无法打开共享对象文件

简介: 全网首发:Linux自带opencv库的JAVA调用失败/java.lang.UnsatisfiedLinkError:libopencv_ml.so.405: 无法打开共享对象文件

  本来以为,修改了rpath之后,问题就解决了。结果依然说库找不到(库在同目录下)。具体来说:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/wuxi/eclipse-workspace/FontTest/lib-native/libopencv_java455.so: libopencv_ml.so.405: 无法打开共享对象文件: 没有那个文件或目录
  at java.lang.ClassLoader$NativeLibrary.load(Native Method)
  at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
  at java.lang.Runtime.load0(Runtime.java:810)
  at java.lang.System.load(System.java:1088)
  at taishan.OpenCVTest.<clinit>(OpenCVTest.java:49)

  吾反复实验都不对,就是说找不到。怎么办?干脆吾自己加载吧。别说,错误马上不一样了。考虑到通用性,使用了一个技巧,通过双层双重循环来处理。终于成功。代码如下:

package taishan;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
public class OpenCVTest
{
  private final static String NATIVE_DIR="/home/wuxi/eclipse-workspace/FontTest/lib-native";
  private final static String LIB_PREFIX       = "libopencv_";
  private final static String LIB_SUFFIX_LINUX = "so";
  private final static String LIB_SUFFIX_MAC   = "dylib";
    private static boolean isOpenCVLoaded = false;;
    private static List<File> getOpenCVFiles(final String dirName)
    {
      if (dirName == null)
      {
        return null;
      }
      File dir = new File(dirName);
      if (!dir.exists() || !dir.isDirectory())
      {
        return null;
      }
      File[] files = dir.listFiles();
      List<File> fileList = new LinkedList<File>();
      for (File file : files)
      {
        String name = file.getName();
        if (name.startsWith(LIB_PREFIX) && name.endsWith(LIB_SUFFIX_LINUX))
        {
          fileList.add(file);
        }
      }
      return fileList;
    }
    private static void loadNativeOpenCV(final String dirName)
    {
      if (isOpenCVLoaded)
      {
        return;
      }
      List<File> fileList = getOpenCVFiles(dirName);
      if (fileList == null || fileList.size() == 0)
      {
        return;
      }
      while (fileList.size() > 0)
      {
        int left = fileList.size();
        for (int i=0; i<fileList.size(); i++)
        {
          File file = fileList.get(i);
          try
          {
            System.load(file.getAbsolutePath());
          }
          catch (java.lang.Throwable e)
          {
            continue;
          }
          fileList.remove(i);
          i--;
        }
        System.out.println(left+" ? "+fileList.size());
        //如果这次循环后,剩余个数跟上次一样,说明依赖库有问题,中断。
        if (left == fileList.size())
        {
          fileList.clear();
          return;
        }
      }
      //如果libopencv_java.so在另外目录,需要单独加载
      //System.load(Dir+"/"+"lib"+Core.Core.NATIVE_LIBRARY_NAME+"."+LIB_SUFFIX_LINUX);
      isOpenCVLoaded = true;
    }
    public static void main(String[] args)
    {
      loadNativeOpenCV(NATIVE_DIR);
        Mat mat = Mat.eye(3, 3, CvType.CV_8UC1);
        System.out.println("mat = "+mat.dump());
    }
}
目录
相关文章
|
3天前
|
IDE Java 编译器
使用Java分割PDF文件
使用Java分割PDF文件
9 1
|
4天前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容
9 0
|
4天前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
12 0
|
1天前
|
算法 Linux Windows
Linux|如何查找和删除重复文件
Linux|如何查找和删除重复文件
8 1
|
18小时前
|
Linux 数据处理
探索Linux下的readelf命令:深入了解ELF文件
`readelf`是Linux下分析ELF文件的命令行工具,用于查看文件头、节区、符号表等信息。支持可执行文件、共享库等多种类型。常用选项有`-h`(文件头)、`-l`(程序头)、`-S`(节区)、`-s`(符号表)、`-r`(重定位)和`-d`(动态节区)。结合其他工具如`objdump`,能深入理解二进制文件,助力开发和调试。
|
2天前
|
Linux
linux不同场景下修改文件名的五种方法
linux不同场景下修改文件名的五种方法
6 1
|
3天前
|
存储 Linux 程序员
tar命令详解:linux文件打包神器
tar命令详解:linux文件打包神器
|
1天前
|
Linux 数据处理 vr&ar
Linux下的ranlib命令:静态库文件的索引生成器
`ranlib`是Linux用于加速静态库(.a文件)链接的工具,它生成索引以优化查找目标文件。当链接器处理静态库时,索引能快速定位目标,提升效率。命令如`ranlib libexample.a`创建索引。注意,新工具链可能已自动包含此功能,使用前应确保库文件未含索引,避免重复生成。
|
2天前
|
关系型数据库 MySQL Shell
深入了解Linux /etc/passwd文件
深入了解Linux /etc/passwd文件
7 0
|
2天前
|
存储 Linux
深入了解Linux设备管理:字符、块和网络设备文件
深入了解Linux设备管理:字符、块和网络设备文件
9 0