开发者社区> 柳鲲鹏> 正文

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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux基础IO【文件理解与操作】
文件操作是 基础IO 学习的第一步,我们在 C语言 进阶中,就已经学习了文件相关操作,比如 fopen 和 fclose,语言层面只要会用就行,但对于系统学习者来说,还要清楚这些函数是如何与硬件进行交互的
8 0
教你如何快速在Linux中找到某个目录中最大的文件
教你如何快速在Linux中找到某个目录中最大的文件
32 0
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
45 0
linux文件误删文件,恢复操作案例
作为一个多用户、多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的。尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据。不过,对于家庭单机使用的Linux,或者误删文件后及时补救,还是可以恢复的。
33 0
Linux下 Samba 服务器搭建——方便Windows环境下与Linux环境进行文件交互使用。
Linux下 Samba 服务器搭建——方便Windows环境下与Linux环境进行文件交互使用。
47 0
Linux: find查找大文件
Linux: find查找大文件
20 0
linux下文件、文件夹相关操作(C语言)
linux下文件、文件夹相关操作(C语言)
29 0
Linux驱动开发——(Linux内核字符设备文件的自动创建)gpio(4)
Linux驱动开发——(Linux内核字符设备文件的自动创建)gpio(4)
29 0
Linux系统中对文件和目录的各种操作
Linux系统中对文件和目录的各种操作
60 0
linux文件重命名命令
linux文件重命名命令有两个,分别是mv和rename。
42 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Decian GNU/Linux安全合规之路
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
冬季实战营第二期:Linux操作系统实战入门
立即下载