如何在Android Studio 3.1.2与NDK 17.0中添加OpenCV库
在Android Studio 3.1.2 + NDK 17.0.4754217中配置OpenCV的完整步骤
我刚帮几个朋友搞定了这套环境下的OpenCV配置,旧指南确实大多过时踩坑点多,下面分Java层快速配置和JNI/CMake深度配置两种场景一步步来,适配你的环境:
一、准备工作
- 下载适配的OpenCV Android SDK:选OpenCV 3.4.2或4.0.0版本(这两个版本完美兼容NDK17),解压后得到
sdk目录。 - 确认AS 3.1.2已安装NDK 17.0.4754217:打开
SDK Manager -> SDK Tools,勾选NDK (Side by side),选择对应版本安装,记住NDK路径。
二、Java层快速配置(无需JNI)
适合只需要在Java代码中调用OpenCV的场景:
- 导入OpenCV Java模块:
- 打开AS,点击
File -> New -> Import Module,选择解压后OpenCV的sdk/java目录,模块名建议设为opencv-java。
- 打开AS,点击
- 添加依赖:
- 在
app/build.gradle的dependencies块中添加:implementation project(':opencv-java')
- 在
- 复制Native库:
- 从OpenCV的
sdk/native/libs目录下,把所有ABI文件夹(如armeabi-v7a、arm64-v8a)复制到app/src/main/jniLibs目录(如果没有jniLibs就新建)。
- 从OpenCV的
- 初始化OpenCV:
- 在Activity的
onCreate中添加初始化代码:static { if (!OpenCVLoader.initDebug()) { // 调试环境用initDebug,发布版换成initAsync Log.e("OpenCV", "初始化失败"); } }
- 在Activity的
三、JNI/CMake深度配置(核心适配NDK17)
如果需要在C/C++代码中调用OpenCV,这部分是重点:
准备OpenCV Native资源:
- 把OpenCV解压后的
sdk/native目录复制到项目根目录,重命名为opencv-native(方便后续路径引用)。
- 把OpenCV解压后的
配置CMakeLists.txt:
- 在
app/src/main/cpp目录下创建CMakeLists.txt,写入以下内容(注意路径根据你的项目调整):cmake_minimum_required(VERSION 3.6.0) # 设置OpenCV的配置文件路径(指向opencv-native下的jni目录) set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../../opencv-native/jni) find_package(OpenCV REQUIRED) # 定义你的Native库 add_library(native-lib SHARED native-lib.cpp) # 链接NDK标准库和OpenCV库 target_link_libraries(native-lib ${OpenCV_LIBS} log android)
- 在
配置app/build.gradle:
- 在
android块中添加外部构建配置:externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.6.0" // AS3.1.2兼容的CMake版本,不要乱改 } } - 在
defaultConfig块中添加NDK和ABI配置:defaultConfig { // ...其他原有配置 externalNativeBuild { cmake { arguments "-DANDROID_ABI=armeabi-v7a,arm64-v8a,x86,x86_64" cppFlags "-std=c++11" // NDK17支持C++11,必须开启 } } }
- 在
在Native代码中调用OpenCV:
- 编辑
native-lib.cpp,引用OpenCV头文件并测试:#include <jni.h> #include <string> #include <opencv2/opencv.hpp> using namespace cv; extern "C" JNIEXPORT jstring JNICALL Java_com_example_yourpackage_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "OpenCV配置成功!"; // 测试OpenCV创建Mat对象 Mat testMat = Mat::zeros(100, 100, CV_8UC3); return env->NewStringUTF(hello.c_str()); }
- 编辑
同步并运行:点击AS右上角的
Sync Now,编译运行即可。
四、常见坑点排查
- 找不到OpenCVConfig.cmake:检查
OpenCV_DIR路径是否指向opencv-native/jni目录(这个目录下必须有该配置文件)。 - ABI不兼容:确保
abiFilters和OpenCVlibs目录下的ABI一致,NDK17已废弃armeabi,不要在参数里加。 - NDK编译报错:OpenCV版本不要太旧(比如3.4.0以下),旧版本可能依赖NDK17已移除的API。
- Java层加载库冲突:如果同时配置了Java和JNI,不要重复调用
OpenCVLoader.initDebug(),统一用JNI链接方式即可。
内容的提问来源于stack exchange,提问作者Álvaro Redosan
相关产品推荐
相关产品推荐

