Android Studio 中使用 C++ 连接 OpenCV
Android Studio 中使用 C++ 连接 OpenCV(OpenCV 4.x + JNI + NDK)
在 Android Studio 中通过 JNI 调用 OpenCV C++ 接口,实现基本图像处理功能。
前提:你已经安装了 Android Studio,并下载了解压 OpenCV Android SDK。
一、环境准备
-
下载 OpenCV Android SDK
链接:https://opencv.org/releases/
解压路径示例:~/Android/OpenCV-android-sdk
-
安装 NDK 与 CMake
- Android Studio >
SDK Manager
>SDK Tools
> 勾选:- NDK
- CMake
- LLDB
- Android Studio >
-
确认你的项目支持 C++
- 新建项目时勾选“Include C++ Support”,语言选择 Java。
- 或者手动添加
CMakeLists.txt
文件和cpp/
目录。
二、导入 OpenCV 库模块
-
导入模块
- Android Studio >
File
>New
>Import Module
- 选择:
<OpenCV-android-sdk>/sdk/java
- Module name 保持默认:
:openCVLibrary4
- Android Studio >
-
编辑
settings.gradle
include ':app', ':openCVLibrary4'
-
在
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'] // 可选}}
}
五、运行与验证
- 真机或模拟器运行项目
- 界面显示 “OpenCV Mat: 300x300” 表示加载成功
- 若失败,检查:
.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 进行处理再回传
八、参考链接
- OpenCV Android 教程
- CMake 配置 OpenCV 教程