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
相关产品推荐
相关产品推荐

