全网首发: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());
    }
}
目录
相关文章
|
6月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
870 157
|
11月前
|
Linux 开发工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
|
6月前
|
Ubuntu 编译器 计算机视觉
Ubuntu 20.04环境下无法找到#include<opencv/cv.h>文件 - 解决方案。
希望这些信息能帮助你解决遇到的问题。
370 10
|
8月前
|
Java Linux Apache
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
488 5
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
|
8月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
9月前
|
存储 数据管理 Linux
区分Linux中.tar文件与.tar.gz文件的不同。
总之,".tar"文件提供了一种方便的文件整理方式,其归档但不压缩的特点适用于快速打包和解压,而".tar.gz"文件通过额外的压缩步骤,尽管处理时间更长,但可以减小文件尺寸,更适合于需要节约存储空间或进行文件传输的场景。用户在选择时应根据具体需求,考虑两种格式各自的优劣。
1562 13
|
10月前
|
安全 Linux
Linux赋予文件000权限的恢复技巧
以上这些步骤就像是打开一扇锁住的门,步骤看似简单,但是背后却有着严格的逻辑和规则。切记,在任何时候,变更文件权限都要考虑安全性,不要无谓地放宽权限,那样可能
318 16
|
8月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
99 0
|
11月前
|
Linux
【Linux】 Linux文件I/O常见操作技巧
以上就是Linux文件I/O操作的一些技巧,接纳它们,让它们成为你在Linux世界中的得力伙伴,工作会变得轻松许多。不过记住,技巧的运用也需要根据实际情况灵活掌握,毕竟,最适合的才是最好的。
306 28
下一篇
开通oss服务