Android Studio 中使用 C++ 连接 OpenCV
摘要:本文介绍了在Android Studio中使用JNI和NDK集成OpenCV 4.x的方法。内容包括:环境准备(安装NDK、CMake和OpenCV SDK)、导入OpenCV库模块、配置JNI本地调用(含C++和Java代码示例)、CMakeLists.txt配置、build.gradle设置以及常见问题解决方案。实现通过JNI调用OpenCV C++接口进行图像处理,并提供后续扩展建议。
·
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.gradleinclude ':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++ 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'] // 可选
}
}
}
五、运行与验证
- 真机或模拟器运行项目
- 界面显示 “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 进行处理再回传
八、参考链接
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)