Ubuntu18.04LTS环境下创建OpenCV4.x-Android库

news2025/1/13 13:59:21

1 背景

1.1 java.lang.UnsatisfiedLinkError: dlopen failed: library “libc++_shared.so” not found

libc++_shared.so 之前默认集成在 opencv_java3.so,但是在OpenCV4.x以后,该动态库默认不集成在opencv_java4.so

1.2 E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV

参考 https://github.com/opencv/opencv/issues/15567#issuecomment-1016603238。这个是OpenCV安卓SDK的问题,不影响正常使用OpenCV库。

2 创建OpenCV-Android库

2.1 下载 opencv-4.6.0-android-sdk

从OpenCV官网下载OpenCV4.6.0的OpenCV for Android压缩文件opencv-4.6.0-android-sdk.zip。

2.2 创建OpenCV4Android项目

利用 Android Studio 3.0.1 创建一个android项目,这里我创建的是OpenCV4Android项目。

2.3 创建OpenCV-Android库

  • 依次点击File->New->New Module…,在弹出的对话框中,选择Android Library,然后,点击Next
  • Application/Library name:处,输入安卓库名称OpenCV-Android
    点击Package name:后面的Edit,修改包名称为org.opencv

2.4 配置OpenCV-Android库

  • 解压下载的 opencv-4.6.0-android-sdk.zip

  • 复制 OpenCV-android-sdk/sdk/java/src/org/opencv 文件夹内的所有子文件夹,并粘贴到OpenCV-Android库中 opencv-android/src/main/java/org/opencv 的文件夹下。

  • opencv-android/src/main/java/org/opencv/android 子文件中,做如下操作:

    • 删除 AsyncServiceHelper.java 文件
    • 修改 OpenCVLoader.java 文件,注释掉以下内容:
    /**
     * Loads and initializes OpenCV library using OpenCV Engine service.
     * @param Version OpenCV library version.
     * @param AppContext application context for connecting to the service.
     * @param Callback object, that implements LoaderCallbackInterface for handling the connection status.
     * @return Returns true if initialization of OpenCV is successful.
     */
    

// public static boolean initAsync(String Version, Context AppContext,
// LoaderCallbackInterface Callback)
// {
// return AsyncServiceHelper.initOpenCV(Version, AppContext, Callback);
// }
```

  • 复制 OpenCV-android-sdk/sdk/java/res/values/attrs.xmlopencv-android/src/main/res/values/ 文件内;

  • 修改 opencv-android/src/main/res/values/string.xml ,修改后如下所示:

    <resources>
    <string name="app_name">OpenCV-4.6.0</string>
    </resources>
    
  • OpenCV-android-sdk/sdk/native/libs 文件夹下的子文件夹和 OpenCV-android-sdk/sdk/native/3rdparty/libs 文件夹下的子文件夹拷贝 opencv-android/src/main 文件下创建的 jniLibs 文件夹内。

3 app文件内相关文件修改

3.1 修改app/src/main/res/layout/activity_main.xml

<TextView>添加id,修改后代码片段如下所示:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cn.epbox.opencv4android.MainActivity">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

3.2 为app添加opencv-android库

  1. 点击 File->Project Structure… 打开 Project Structure 对话框;
  2. 点击 Modules 下的app,再在右侧点击 Dependencies
  3. 点击Dependencies下框附近的 + 号,选择 3 Module Dependency ,在弹出的对话框中,选择 :opencv-android ,最后依次点击 OKOK

3.3 修改MainActivity

添加TextView对象,如果点击该对象,则弹出一个短消息!

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView textView = (TextView) findViewById(R.id.text_view);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "You clicked textView!", Toast.LENGTH_SHORT).show();
                if (OpenCVLoader.initDebug()) {
                    textView.setText("OpenCV-4.6.0 loaded successful!");
                }
            }
        });
    }
}

4. 处理 library “libc++_shared.so” not found

  • 点击 File -> Settings… ,按照下图定位到SDK Tools,选择NDK最新版本号。依次点击Apply, OK。
    在这里插入图片描述
  • 复制 /home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.soopencv-android/src/main/jniLibs/arm64-v8a/
  • 复制 /home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.soopencv-android/src/main/jniLibs/armeabi-v7a/
  • 复制 /home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.soopencv-android/src/main/jniLibs/x86/
  • 复制/home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.soopencv-android/src/main/jniLibs/x86_64/

5. 运行

点击 Run->Run ‘app’ ,连接手机的界面如下所示:

在这里插入图片描述

点击,Hello World!后的界面如下所示:

在这里插入图片描述

找到opencv-android库对应的aar文件

opencv-android/build/outputs/aar文件夹下,生成的debug和release两种格式的aar文件夹。

opencv-android-debug.aar
opencv-android-release.aar

如何导入aar文件

参考这里

Bonus

修改app和opencv-android文件夹内的build.gradle文件中的buildTypes字段,仅生成适合指定平台的apk文件。

    buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
            // added by JohnTian
            splits {
                abi {
                    enable true
                    reset()
                    include 'armeabi-v7a', 'arm64-v8a'
                    universalApk false
                }
            }
        }

参考

  • Cannot load info library for OpenCV #15567
  • Пишем простейшее приложение под Android для распознавания объектов с камеры

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NLP学习之:Bert 模型复现(1)任务分析 + 训练数据集构造

​ 文章目录代码资源原理学习任务代码讲解代码重写说明代码资源 Bert-pytorch 原理 学习任务 Bert 本质上是 Transformer 的 Encoder 端&#xff0c;Bert 在预训练时最基本的任务就是&#xff1a; 判断输入的两个句子是否真的相邻预测被 [MASK] 掉的单词 通过这两种任务的约…

面了个腾讯拿28k跳槽出来的,真正见识到了跳槽天花板

最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备金九银十的面试计划。 作为一个入职5年的老人家&#xff0c;目前工资比较乐观&#xff0c;但是我还是会选择跳槽&#xff0c;因为感觉在一个舒适圈待久了&#xff0c;人过得太过安逸&#xff0c;晋升涨…

ToDesk使用

现在的终端产品种类非常的多&#xff0c;常见的包括tablet, 手机&#xff0c;笔记本 ,ipod...等等&#xff0c;这些终端带屏产品连同台式机&#xff0c;智能电视等固定设备占据了我们的工作和生活中的大部分时间&#xff0c;不知道你发现没有&#xff0c;使这些不同种类的产品之…

[机器学习、Spark]Spark MLlib实现数据基本统计

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;Spark MLlib基本统计 &#x1f4d1;&#x1f4d1;下篇文章预告&#xff1a;Spark MLlib的分类&#x1f525;&#x1f525; 简介&…

Java多线程【锁优化与死锁】

Java多线程【锁优化与死锁】&#x1f352;一.synchronized的优化&#x1f34e;1.1基本特点&#x1f34e;1.2加锁工作过程&#x1f34e;1.3优化操作&#x1f352;二.死锁&#x1f34e;2.1什么是死锁&#x1f34e;2.2 一对一死锁&#x1f34e;2.3 二对二死锁&#x1f34e;2.4 N对…

Web 1.0、Web 2.0 和 Web 3.0 之间的比较

&#x1f482; 个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的 P…

目前最先进的神经网络算法,神经网络算法发展

1、神经网络的发展趋势如何&#xff1f; 神经网络的云集成模式还不是很成熟&#xff0c;应该有发展潜力&#xff0c;但神经网络有自己的硬伤&#xff0c;不知道能够达到怎样的效果&#xff0c;所以决策支持系统中并不是很热门&#xff0c;但是神经网络无视过程的优点也是无可替…

HTML5新特性

H5新增 1) 新增选择器 document.querySelector、document.querySelectorAll doucment.querySelector(#sampel) // 选择id doucment.querySelector(.sampel) // 选择出现的第一个类 doucment.querySelectorAll(.sampel)[0] // 选择出现的第一个类2)拖拽释放(Drag and drop) AP…

2022年江西省赣育杯网络安全大赛学生组WebMisc Writeup

文章目录WEB签到easyzphpezpyMISCbyteMuisc有趣的PDFWEB 签到 ?id-1union select 1,(select group_concat(schema_name) from information_schema.schemata),3,4,5--?id-1union select 1,(select group_concat(table_name) from information_schema.tables where table_sch…