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

Windows版Android Studio 2.2中CMake构建原生代码调用OpenCV问题

解决Android Studio 2.2(Windows)原生代码调用OpenCV的问题

首先明确回答你:完全可以借助标准C++支持在Windows版Android Studio 2.2中实现原生代码调用OpenCV。你Java层能正常使用OpenCV,说明基础的SDK引入没问题,原生层的报错大概率是CMakeLists.txt和Gradle的配置没覆盖到原生编译环节,下面一步步帮你梳理解决:

1. 先确认OpenCV Android SDK的结构

确保你下载的OpenCV Android SDK里存在native目录,里面要包含:

  • 不同ABI的库文件夹(比如arm64-v8a、armeabi-v7a)
  • jni/include目录(存放OpenCV的C++头文件)

2. 核心:修改CMakeLists.txt配置

这是让原生代码找到OpenCV头文件和库的关键,把你的原生模块CMakeLists.txt改成下面这样:

# 设置CMake最低版本,和Android Studio 2.2适配
cmake_minimum_required(VERSION 3.4.1)

# 定义OpenCV的native配置路径,替换成你本地SDK的实际路径
# Windows路径记得用/或者\\,比如:set(OpenCV_DIR "D:/OpenCV-android-sdk/native/jni")
set(OpenCV_DIR "你的OpenCV Android SDK native/jni目录绝对路径")

# 查找OpenCV库
find_package(OpenCV REQUIRED)

# 定义你的原生库目标(比如你的native-lib)
add_library(
        native-lib
        SHARED
        native-lib.cpp)

# 链接OpenCV库和系统日志库到你的原生库
target_link_libraries(
        native-lib
        ${OpenCV_LIBS}
        log)

如果不想写绝对路径,也可以把OpenCV的native目录作为依赖模块导入,但Windows环境下直接用绝对路径更不容易出路径解析问题。

3. 调整模块级build.gradle配置

在app模块的build.gradle里补充这些配置,确保编译时能正确打包OpenCV的原生库:

android {
    defaultConfig {
        // ...你的其他配置(比如minSdkVersion等)
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11" // OpenCV需要C++11及以上支持
                abiFilters 'armeabi-v7a', 'arm64-v8a' // 和OpenCV支持的ABI保持一致
            }
        }
        // 指定OpenCV原生库的路径
        sourceSets {
            main {
                jniLibs.srcDirs = ['你的OpenCV Android SDK native/libs目录路径']
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt" // 指向你的CMakeLists文件位置
        }
    }
}

4. 解决#include <opencv2/core.hpp>的报错

如果做完上面的配置还是头文件报错,试试这几个排查点:

  • 检查OpenCV_DIR的路径是否正确,Windows路径的斜杠别写错
  • 点击Android Studio顶部的File -> Sync Project with Gradle Files,同步后再重新编译
  • 查看CMake编译日志:执行Build -> Make Project后,在Build面板里找CMake输出,如果有Found OpenCV: ...的提示,说明路径配置没问题
  • 要是还是不行,可以手动在CMakeLists.txt里添加头文件路径兜底:
include_directories("你的OpenCV Android SDK native/jni/include")

5. 测试原生代码调用

现在可以在native-lib.cpp里写测试代码验证:

#include <jni.h>
#include <string>
#include <opencv2/core.hpp>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_yourapp_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++ with OpenCV!";
    // 测试OpenCV核心类是否能正常使用
    cv::Mat testMat(100, 100, CV_8UC3);
    return env->NewStringUTF(hello.c_str());
}

编译运行后如果能正常输出字符串,说明原生层的OpenCV配置就成功了。


内容的提问来源于stack exchange,提问作者Yusuf Çelebi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:08:00