Java怎么在LINUX上加载OpenCV so库

  这个范例不一定能跑起来。原因就是依赖库加载的问题。如果libopencv_java.so:

  • 包含其他所有的so功能,上述博文就是对的。

  • 如果不包含,需要一定的加载技巧。

如何在LINUX上加载OpenCVso库Java实现OpenCV加载教程

  代码范例如下:

package taishan;


import java.io.File;

import java.util.LinkedList;

import java.util.List;


import org.opencv.core.CvType;

import org.opencv.core.Mat;


@SuppressWarnings("
serial"
)
public class OpenCVTest
{
public final static String LIB_PATH = "
/home/wuxi/eclipse-workspace/OpenCVTest/libs/bin"
;


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"
) &
&
name.endsWith("
.so"
))
{
fileList.add(file);

}
}
return fileList;

}

private static void loadNativeOpenCV(final String dirName)
{
List<
File>
fileList = getOpenCVFiles(dirName);

if (fileList == null || fileList.size() == 0)
{
return;

}

while (fileList.size() >
0)
{
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--;

}
}

//如果libopencv_java.so在另外目录,需要单独加载
//System.load(Dir+"
/"
+"
lib"
+Core.Core.NATIVE_LIBRARY_NAME+"
."
+LIB_SUFFIX_LINUX);

}

public static void main(String[] args)
{
loadNativeOpenCV(LIB_PATH);


Mat m = Mat.eye(3, 3, CvType.CV_8UC1);

System.out.println("
m = "
+ m.dump());

}
}

  关键的一句就是要正确找到so包。



在LINUX上使用OpenCV,可能会遇到加载so库的问题。so库是由C/C++编写的动态链接库,是OpenCV库常用的文件格式。本篇文章将介绍Java语言如何在LINUX下加载OpenCV so库。
一、编写Java代码加载so库
Java里的加载so库,基于Java Native Interface (JNI)。JNI是Java平台特定的桥接库,它能够应用JavaVM运行Java代码,调用C/C++库函数。JNI 提供了许多std接口让你能够在Java应用中使用C/C++库。这些std接口包含了许多JNI函数,以及JNIEnv结构体用于调用Native函数。
在Java中基于JNI调用so库,首先需要在Java应用中加载JNI库,其次,使用System.loadLibrary函数在Java应用中调用so库。System.loadLibrary是一个JNI接口实现函数,能够加载so库到Java应用中。
为此,首先编写Java代码加载JNI库:
```java
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
```
代码的作用是加载OpenCV JNI依赖库。
接着,使用System.loadLibrary函数调用OpenCV so库:
```java
System.loadLibrary(\"opencv_java411\");
```
这个代码片段将加载所需的so库。
二、加载单个或多个so库
在LINUX操作系统上,很多C/C++库函数都可以将其编译成.so格式,编译生成的so库也可以使用在Java应用中。使用JNI加载单个so库非常简单,只需调用System.loadLibrary函数并传入so库的名称即可。
在调用多个so库时,可将不同的so库放置在不同的文件夹下并将其配置到LD_LIBRARY_PATH环境变量中。例如:
```linux
# 将opencv411.so所在的目录加到LD_LIBRARY_PATH中
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
```
然后,在Java代码中使用System.load函数分别加载so库:
```java
System.loadLibrary(\"opencv_java411\");
```
这样就能够在Java应用中调用多个so库了。
三、使用OpenCV加载图片等资源
使用OpenCV做图像处理时,需要加载图像或其他文件资源。
使用OpenCV载入图像,可以使用imread函数。但需要注意的是,对于不同操作系统,图片文件路径写法可能不同。
Linux操作系统上,“/”为分隔符。而Windows操作系统上,“\\”为分隔符。
在Java代码中,需要使用File.separator来动态获取操作系统的路径分隔符。并使用opencv_imgcodecs的imread函数读取图片:
```java
public static Mat loadImage(String imagePath) {
File file = new File(imagePath);
if(!file.canRead()) {
System.out.println(\"File Not Found:\" + imagePath);
return null;
}
return Imgcodecs.imread(imagePath);
}
```
本篇文章介绍了Java在LINUX中加载OpenCV so库的内容。通过使用JNI调用Native函数,Java能够访问在LINUX操作系统下生成的C/C++库。同时,为了支持多个so库,可以通过设置LD_LIBRARY_PATH环境变量加载多个so库,并在Java代码中分别使用System.load函数加载。为了方便处理图像资源,需要使用OpenCV提供的opencv_imgcodecs库函数读取图片文件。
现在,你已经掌握了Java在LINUX中加载OpenCV so库的方法,快来体验吧!