全网首发: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());
    }
}


目录
相关文章
|
17天前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
236 20
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
54 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
37 6
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
50 0
|
Java 大数据 Apache
|
Java Windows 移动开发