You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的场景:

  1. 导入OpenCV Java模块:
    • 打开AS,点击File -> New -> Import Module,选择解压后OpenCV的sdk/java目录,模块名建议设为opencv-java。
  2. 添加依赖:
    • 在app/build.gradle的dependencies块中添加:
      implementation project(':opencv-java')
      
  3. 复制Native库:
    • 从OpenCV的sdk/native/libs目录下,把所有ABI文件夹(如armeabi-v7a、arm64-v8a)复制到app/src/main/jniLibs目录(如果没有jniLibs就新建)。
  4. 初始化OpenCV:
    • 在Activity的onCreate中添加初始化代码:
      static {
          if (!OpenCVLoader.initDebug()) {
              // 调试环境用initDebug,发布版换成initAsync
              Log.e("OpenCV", "初始化失败");
          }
      }
      

三、JNI/CMake深度配置(核心适配NDK17)

如果需要在C/C++代码中调用OpenCV,这部分是重点:

  1. 准备OpenCV Native资源:

    • 把OpenCV解压后的sdk/native目录复制到项目根目录,重命名为opencv-native(方便后续路径引用)。
  2. 配置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)
      
  3. 配置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,必须开启
              }
          }
      }
      
  4. 在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());
      }
      
  5. 同步并运行:点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:10:23