Android:opencv环境搭建及其遇到的坑

  1. 搭建opencv版本号:
    • Android studio:Android Studio Arctic Fox | 2020.3.1 Patch 3
    • opencv:opencv4.5.4版本
  2. 环境搭建流程
    • 吐槽:书写环境搭建前先吐槽一些真是没有最坑只有更坑,搭建一个环境坑到家了,opencv的版本兼容大坑再加上as的版本坑,哎真是坑的一言难尽,网上的资料更是操蛋,很多都是copy的有没有实测过都不一定,比如libc++_shared.so not found 网上很多文章都是单纯的配置build文件并没有完整的讲解ndk的配置,能解决才怪呢。
    • 下载opencv对应的Android 工程包 下载地址,可以下载最新的,也可以下载以往版本,下载完成后解压后的文件夹如下:
      opencv解压文件夹

      sdk下文件夹

      native下文件夹

备注:samples:opencv当前版本案例文件夹,sdk:opencv对应sdk文件夹 etc:opencv扩展功能文件夹 java:opencv java封装接口文件夹,主要是对下层opencv的函数的java封装 native:opencv底层实现文件夹
native中libs:opencvjava4.so opencv native实现的so文件,Android的上层调用重点使用java和native文件夹中的libs两个文件夹。

  • 创建as工程,import module 打开上面的opencv文件夹中的java文件夹,以module的方式将其引入,此乃第一大坑,as gradle 编译,opencv中java并没有提供对应的build文件,所以使用上面as版本不能直接import,卡在选择文件夹后仅有cancel没有下一步,网上有资料说是as这个版本bug,也不愿追究了总之是坑,使用下面方式进行解决:
    • 新建module工程,注意工程包名使用opencv java提供的包名,工程名可以任意提供,将java下的代码及其res文件夹copy到module的对应工程中去,即java没有提供build,只能新建工程创建build文件(类似于eclipse工程到as的转化)

    • opencv中的aidl

      备注:copy过程中还需要注意这个文件夹并不是普通的代码文件,是aidl文件夹需要以aidl的方式将其引入。

    • 将opencv的native文件夹下的lib中所有子文件夹(可以根据机型的cpu类型选择对应的)copy到module中去(以jnilibs的方式),需要注意的是Android 默认JniLibs为jni的默认文件夹,如不是放到这个文件夹(通常习惯放到libs中去)需要在build文件中声明:


      jni声明
      • 常规流程到这里就完成了,编译成功也没有报错 赶紧写个小Demo测试一下 编码编译运行一气呵成,尼玛点击直接崩溃,我去 这心情比吃屎都难受啊,不对啊,按照网上说的流程都做了啊,还依靠自己的经验做到了不能做的 怎么会崩溃呢,好在log有提示那就继续一步一步排坑吧
        • OpenCV error: Cannot load info library for OpenCV:不能加载opencv info lib库,资料解释是opencv最新版本没有对应的lib库,先前版本有 你说这坑不坑,新版本没有咱就别用了,用了咱就提供呗,没有只能去找老版本,opencv下载还挺慢,费劲八叉的下载完成还是没有,github上到时搜到了,下载放入后还是崩溃不能加载,debug发现找到的是32位编译的,现在手机多数都是64位的,没辙了看来免费的没戏了 只能在csdn下载了,本部富裕的家庭雪上加霜 好在c币买来的可以使用 不然就真的坑死了,下载链接不贴了,有需要的评论联系吧。
          • 集成第三SO之DLOPEN FAILED: LIBRARY "LIBC++_SHARED.SO" NOT FOUND:解决了info lib库,opencv javalib库还是不能加载,提示上面错误,原因是 opencv lib库依赖于libc++_shared lib 库,但是普通工程加载so文件不会生成对应的shared lib库的,网上多数资料也是说明修改build 文件 而没有表明修改build文件后还需要ndk编译流程才能生成对应的shared lib库,对应解决可以参考下面大神的文章:copy HelloJniDemo ndk编译生成对应的shared lib库,编译生成后的shared lib库在build的临时文件中可以获取(针对不同的cpu有着不同的生成),同时小经验:ndk编译文件 cmake尽可能不要自己去写,去搞一个别人的了解cmake的语法和机制就好了。
      • Android opencv的初始化流程如下:


        opencv初始化代码
  1. 搭建环境遇到的坑
    • opencv中java文件夹不能以module方式引入(参考上面)
    • 新建module copy所有文件夹忽略掉aidl文件夹(参考上面)
    • Cannot load info library for OpenCV 异常(参考上面)
    • LIBRARY "LIBC++_SHARED.SO" NOT FOUND 异常(参考上面)
    • opencv的初始化及其监听初始化结果(参考上面)
    • opencv 图片灰度值Demo设置属性失败造成崩溃(不要乐极生悲,编译成功一高兴那就可悲了)
    • 伴随环境搭建as中需要记录的几个知识点:
      • as项目导入jni so 库:JniLibs文件夹和libs文件夹区别(参考上面)
      • NDK路径:sdk管理器已经下载对应的ndk版本,但是新建工程并没有识别ndk路径需要在local.properties中声明ndk 路径,需要注意此时的系统路径规范(linux和windows路径语法不同)还有就是需要确认到ndk的版本号文件夹,声明后项目ndk路径也就有了,但是编译有提示此处设置后续可能被抛弃,所以不建议在此地声明,哎 as的bug真心不少,下载了你不识别,声明了你又说后续要抛弃不能用 到底要做什么,还有就是build声明ndk版本号如下:
        ndk版本号

        备注:gradle编译和ndk的版本号有关,不同的编译版本对应不同的ndk版本,不建议ndk太新版本。

      • andriod项目文件夹梳理: java,res,assets,aidl,cpp 等文件夹是同一级目录,JniLibs,libs,src是同一级目录。

参考文章:
Android:opencv环境搭建
Android:opencv的初始化
libc++_shared.so not found bug异常解决
build中ndk版本号的设置
Android官网:c++库支持
github:Android NDK案例集合

你可能感兴趣的:(Android:opencv环境搭建及其遇到的坑)