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


    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);
    //    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 复制 OpenCV-android-sdk/sdk/java/res/values/attrs.xmlopencv-android/src/main/res/values/ 文件内;

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

      
      OpenCV-4.6.0
      
      
      • 1
      • 2
      • 3
    • 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

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

    
    
    
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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!");
                    }
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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
    
    • 1
    • 2

    如何导入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
                    }
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    参考

  • 相关阅读:
    Linux服务器上测试TCP/UDP端口的连通性
    java-net-php-python-springboot办公自动化系统计算机毕业设计程序
    《软件方法》应用-订单拣选和阿布思考法
    最近在看抖音推文
    Springboot笔记-有header的post请求、get请求
    猿创征文|三维重建领域的开发者工具箱
    智能仓储机器人设计
    恢复删除文件?不得不掌握的4个方法!
    GitHub/Gitee静态页托管页部署SSL证书
    Python移除指定文件夹中所有文件名称中的特殊字符(数字、特殊字符、空格等)、只保留字母字符
  • 原文地址:https://blog.csdn.net/tianzhaixing/article/details/127462508