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++ so
        System.loadLibrary("native-lib");    // 加载你写的 native-lib
    }

    public native String stringFromJNI();

    @Override
    protected 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 reference CMake 未正确链接 OpenCV,检查 find_package(OpenCV REQUIRED)${OpenCV_LIBS}
编译不过 路径包含空格、中文,或版本不一致

七、后续拓展建议

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

八、参考链接

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐