写在前
现在是2020.12,此时debian10已经出了。但是在debian10上编译出来的java库并不能够识别。原因没有找到。然后又在debian9、ubuntu18和deepin上进行测试,都能够正确编译。中间有很多坑。尤其是我用debian10编译的时候,坑了我一天半,最后换系统皆大欢喜。在此分享给大家心酸历程。
opencv-4.1.2/
├── 3rdparty
├── apps
├── cmake
├── CMakeLists.txt
├── CONTRIBUTING.md
├── data
├── doc
├── include
├── LICENSE
├── modules
├── platforms
├── README.md
└── samples
进入opencv-4.1.2
#进入文件夹
cd opencv-4.1.2
#创建build文件夹
mkdir build
#进入build文件夹
cd build
[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
$ 注意 $ : libjasper-dev 无法找到。如果你是Ubuntu,就需要添加一个源,如果你是debian,可能就需要自己编译了。
当然我用不上这个插件,就直接把这个包去掉了。不安装libjasper-dev
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local BUILD_SHARED_LIBS=OFF ..
#这个有很多选项。我用默认的就可以编译出java
注意,坑来了!
如果这里cmake成功之后,在你的输出日志最后几行有这个:
-- Java:
-- ant: /usr/bin/ant (ver 1.10.5)
-- JNI: /opt/jdk1.8/include /opt/jdk1.8/include/linux /opt/jdk1.8/include
-- Java wrappers: YES
-- Java tests: YES
恭喜你,不用折腾了。直接make就可以。
否则,分成以下几种情况:
说明你没有安装ant或者对于找不到ant的安装位置。
#1. 安装ant
sudo apt install ant
#2. 如果安装成功,重新运行cmake,ant还是没有被识别,那么你需要手动添加ant的位置
# 直接终端运行
export ANT_HOME=/usr/share/ant/ #当然你把这句话写到/etc/profile最后一行也行。记得要source /etc/profile一下
#回到build 目录,重新cmake以下
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local BUILD_SHARED_LIBS=OFF ..
补充:如果你的ant不在/usr/share/ant,你需要自己定位安装文件夹。
#查看ant位置
whereis ant
#得到的位置是一个软连接,所以要看链接到哪里
ls -an _whereis得到的第一个_
安装目录有bin、etc、lib三个文件夹
检查软链接的目录是不是安装目录。不是继续ls -an查它。
export JAVA_HOME=xxxxxxxx #你javahome的地址。
如果有多个java,需要设置默认的java环境。搜索如何设置。我另一篇帖子有。
4.12 在oracle jdk1.8 和open jdk11都编译通过。open jdk1.8没有尝试。
如果你 ANT和JNI都没问题。剩下两个 应该也是yes了。
以eclipse为例,idea我尝试,不敢乱说。
Linux下还是简单的。只需要两步:
如果没有说明你的编译有问题,查看cmake的记录。是否有java选项
详见官网eclipse配置
新建工程。在build path中加入刚才的opencv4.12库
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
public class Hello
{
public static void main( String[] args )
{
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
Mat mat = Mat.eye( 3, 3, CvType.CV_8UC1 );
System.out.println( "mat = " + mat.dump() );
}
}
写在最后:在debian10里面loadLibrary总出问题,最终也没找到原因。所以换到了其他的。其实兜兜转转,自己纵向成为特别一点的人,这么多年一直有些抵触ubuntu。但是,不得不说ubuntu是挺省心的。从debian10换到debian9,又因为声卡问题换到了ubuntu。有时候过度的折腾反而是浪费时间。已经过了折腾的年纪,系统于我就是生产力工具。如果这次直接上ubuntu,可能一下午就完事了。一切顺风顺水。
如果只是把linux当做生产力工具,尽量不要选择最新的系统。