在 Android Studio 中连接新版 OpenCV(4.11)
很多教程都无法正常在新版工作,因此这里我更新一下教程。后面会再写一个如何加入cpp的教程。
一、准备工作
-
下载 OpenCV Android SDK
- 访问:https://opencv.org/releases/
- 下载如
OpenCV-4.x.x-android-sdk.zip
- 解压至任意目录,例如:
~/Android/OpenCV-android-sdk
-
安装 Android Studio
二、新建 Android 项目
- 打开 Android Studio,选择
New Project
- 使用
Empty Activity
- 输入项目名,例如
OpenCVTest
- 设置语言为
Java
或Kotlin
(建议使用 Java) - 选择合适的最小 API Level(建议 API 21 或更高)
三、集成 OpenCV 库
方式一:使用 OpenCV SDK 模块(推荐)
-
导入 OpenCV SDK 模块
- 在 Android Studio 中右键项目根目录 >
New
>Import Module
- 路径选择:
<OpenCV-android-sdk>/sdk/java
- Module name 保持默认:
:openCVLibrary4
- 在 Android Studio 中右键项目根目录 >
-
将 OpenCV 模块添加到你的 app 中
编辑
settings.gradle
:gradleinclude ':app', ':openCVLibrary4'
编辑
app/build.gradle
:gradledependencies { implementation project(':openCVLibrary4') }
四、配置 Native 支持(可选)
如果你需要使用 OpenCV 的 C++ 接口(如通过 JNI),可添加 NDK 支持。
-
启用 C++ 支持
- 在新建项目时勾选"Include C++ Support",或
- 手动添加
CMakeLists.txt
与 JNI 源码
-
编辑 CMakeLists.txt
cmakecmake_minimum_required(VERSION 3.4.1) set(OpenCV_DIR <OpenCV-android-sdk>/sdk/native/jni) find_package(OpenCV REQUIRED) add_library(native-lib SHARED native-lib.cpp) target_link_libraries(native-lib ${OpenCV_LIBS} log)
-
配置
build.gradle
gradleexternalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } sourceSets { main { jniLibs.srcDirs = ['<OpenCV-android-sdk>/sdk/native/libs'] } }
五、加载 OpenCV 库
在 MainActivity.java
中添加如下代码:
java
import org.opencv.android.OpenCVLoader;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "OpenCV";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!OpenCVLoader.initDebug()) {
Log.e(TAG, "OpenCV initialization failed!");
Toast.makeText(this, "OpenCV initialization failed!", Toast.LENGTH_LONG).show();
} else {
Log.i(TAG, "OpenCV loaded successfully");
}
}
}
六、验证配置
-
运行 app,查看 Logcat 是否输出:
OpenCV loaded successfully
-
若提示失败,确认:
jniLibs
是否包含了合适架构的.so
文件OpenCVLoader.initDebug()
被正确调用
七、调试和注意事项
-
initDebug()
仅适用于调试模式。发布版本请使用OpenCV Manager
或静态初始化。 -
可用命令确认
.so
文件架构是否匹配:bashfile libopencv_java4.so
-
若使用 Kotlin,语法略有差异,注意 API 兼容性。
八、附录
JNI 示例:
cpp
#include <jni.h>
#include <string>
#include <opencv2/core.hpp>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_opencvtest_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
cv::Mat mat = cv::Mat::eye(3, 3, CV_8UC1);
std::string msg = "OpenCV Mat:\n" + std::to_string(mat.rows) + "x" + std::to_string(mat.cols);
return env->NewStringUTF(msg.c_str());
}