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


目录
相关文章
|
10天前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
31 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
10天前
|
Linux
linux中查看某个文件夹下文件的个数和大小
这篇文章介绍了在Linux系统中使用各种命令(如`stat`、`wc`、`du`和`ls`)来查看文件夹下文件的个数和大小的方法。
46 4
linux中查看某个文件夹下文件的个数和大小
|
10天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
26 1
|
4天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
11 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
10天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
13 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
6天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
17 4
|
11天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
25 10
|
5天前
|
安全 Linux 数据安全/隐私保护
探索Linux操作系统的文件权限管理
【9月更文挑战第29天】在数字世界中,文件权限管理如同保护我们隐私的锁。本文将带你了解如何在Linux系统中设置和管理文件权限,确保你的数据安全。我们将一起学习如何通过命令行工具来控制文件访问,就像学习一门新语言一样有趣。准备好了吗?让我们一起开启这场技术之旅!
|
8天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
43 4
|
7天前
|
Linux
深入理解Linux中的cp命令:文件与目录的复制利器
深入理解Linux中的cp命令:文件与目录的复制利器
下一篇
无影云桌面