当前位置: 首页 > news >正文

Android Studio 中使用 C++ 连接 OpenCV

Android Studio 中使用 C++ 连接 OpenCV(OpenCV 4.x + JNI + NDK)

在 Android Studio 中通过 JNI 调用 OpenCV C++ 接口,实现基本图像处理功能。

前提:你已经安装了 Android Studio,并下载了解压 OpenCV Android SDK。


一、环境准备

  1. 下载 OpenCV Android SDK
    链接:https://opencv.org/releases/
    解压路径示例:~/Android/OpenCV-android-sdk

  2. 安装 NDK 与 CMake

    • Android Studio > SDK Manager > SDK Tools > 勾选:
      • NDK
      • CMake
      • LLDB
  3. 确认你的项目支持 C++

    • 新建项目时勾选“Include C++ Support”,语言选择 Java。
    • 或者手动添加 CMakeLists.txt 文件和 cpp/ 目录。

二、导入 OpenCV 库模块

  1. 导入模块

    • Android Studio > File > New > Import Module
    • 选择:<OpenCV-android-sdk>/sdk/java
    • Module name 保持默认::openCVLibrary4
  2. 编辑 settings.gradle

    include ':app', ':openCVLibrary4'
    
  3. app/build.gradle 中添加依赖

    dependencies {implementation project(':openCVLibrary4')
    }
    

三、配置 JNI + OpenCV 本地调用

1. 项目结构

MyOpenCVApp/
├── app/
│   ├── src/
│   │   ├── main/
│   │   │   ├── cpp/
│   │   │   │   └── native-lib.cpp
│   │   │   ├── java/
│   │   │   │   └── com/example/myopencvapp/MainActivity.java
│   │   │   ├── res/
│   │   │   └── AndroidManifest.xml
│   │   └── CMakeLists.txt

2. 示例 native-lib.cpp

#include <jni.h>
#include <string>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myopencvapp_MainActivity_stringFromJNI(JNIEnv* env, jobject /* this */) {cv::Mat mat = cv::Mat::zeros(300, 300, CV_8UC3);std::string info = "OpenCV Mat: " + std::to_string(mat.rows) + "x" + std::to_string(mat.cols);return env->NewStringUTF(info.c_str());
}

3. 示例 MainActivity.java

package com.example.myopencvapp;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("opencv_java4");  // 加载 OpenCV C++ soSystem.loadLibrary("native-lib");    // 加载你写的 native-lib}public native String stringFromJNI();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}
}

4. CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)# 设置 OpenCV SDK 路径
set(OpenCV_DIR /absolute/path/to/OpenCV-android-sdk/sdk/native/jni)# 查找 OpenCV 包
find_package(OpenCV REQUIRED)add_library( native-lib SHARED native-lib.cpp )find_library( log-lib log )target_link_libraries( native-lib${OpenCV_LIBS}${log-lib} )

⚠️ 注意:OpenCV_DIR 必须为绝对路径


四、配置 build.gradle

app/build.gradle 中添加:

android {...defaultConfig {...externalNativeBuild {cmake {cppFlags "-std=c++11"}}ndk {abiFilters "armeabi-v7a", "arm64-v8a" // 只保留你需要的架构}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"}}sourceSets {main {jniLibs.srcDirs = ['src/main/jniLibs'] // 可选}}
}

五、运行与验证

  1. 真机或模拟器运行项目
  2. 界面显示 “OpenCV Mat: 300x300” 表示加载成功
  3. 若失败,检查:
    • .so 文件是否匹配架构
    • System.loadLibrary("opencv_java4") 是否调用正确
    • OpenCV_DIR 设置路径是否正确

六、常见问题

问题解决方法
找不到 opencv_java4.so确保包含了 OpenCV SDK 中的 jniLibs/ 目录,或手动拷贝
undefined referenceCMake 未正确链接 OpenCV,检查 find_package(OpenCV REQUIRED)${OpenCV_LIBS}
编译不过路径包含空格、中文,或版本不一致

七、后续拓展建议

  • 使用 OpenCV 图像处理模块(如 Canny、Blur、Hough)
  • 使用 cv::VideoCapture 读取相机(需 JNI 封装)
  • 图像从 Java 传递至 JNI 进行处理再回传

八、参考链接

  • OpenCV Android 教程
  • CMake 配置 OpenCV 教程

相关文章:

  • Android studio打包生成jar包文件
  • Spring Cloud使用Eureka调用接口,超时设置(二)
  • Python爬取豆瓣短评并生成词云分析
  • 21 大刷题平台开启编程王者之路
  • Macbook如何关闭掉端口
  • 【WPF】WPF ComboBox 数据驱动不刷新?SelectedItem 与 SelectedIndex 解析!
  • 2025年SYN-CC混合攻击防御实战:某金融平台抵御800Gbps双重风暴实录
  • AI预警,数据“解码”:我们如何用技术为象牙塔筑起金融防火墙?
  • 北航将层次对称性引入多智能体强化学习,提升样本效率
  • 解决 Ruby Gem “rexml“ 版本不兼容问题 (CocoaPods/Firebase 相关错误)
  • vue3-标签的ref属性,props的使用,vue3的生命周期详解
  • 数据结构 双向链表与双向循环链表 6.17
  • 14.2 《3小时从零搭建企业级LLaMA3语言助手:GitHub配置+私有化模型集成全实战》
  • QGIS新手教程5:图层属性查询与表达式筛选技巧
  • 鸿蒙组件通用属性深度解析:从基础样式到高级定制的全场景指南
  • AI编程浏览器插件(简易版)
  • 云原生时代配置中心全景解读:从Spring Cloud Config到Nacos深度实践
  • 图扑 HT 3D 场景视频嵌入应用功能
  • JVM(4)——引用类型
  • 【JVM 09-垃圾回收】
  • 郑州web网站制作/定制网站
  • 网站推广中的评估指标有哪些/seo百度快速排名
  • 济南市住房和城乡建设局网站/最新百度快速排名技术
  • 汉服网站的建设/美橙互联建站
  • 网站建设太金手指六六二九/广东搜索引擎优化
  • 如何为自己的店铺做网站/企业网站seo贵不贵