在 Android Studio 中使用 JNI (Java Native Interface) 编译 OpenCV 是一个相对复杂的过程,涉及到多个步骤。以下是一个详细的指南,帮助你从零开始设置并编译包含 OpenCV 的 Android 应用。
一、前期准备
在开始之前,确保你已经安装了 Android Studio、NDK (Native Development Kit) 和 CMake,你也需要下载并安装 OpenCV 库。
二、创建新的 Android 项目
1、打开 Android Studio,选择“新建项目”。
2、选择你要创建的项目类型,Empty Activity”。
3、输入项目名称和位置,然后点击“完成”。
三、配置 CMake
1、在项目结构中,找到你的模块(通常是 app),右击选择“Open Module Settings”。
2、在左侧菜单中选择“SDK Location”,确保 NDK 和 CMake 已经安装。
3、回到“Modules”选项卡,选择你的模块,然后点击“+”号添加一个新的源文件(cpp)。
4、在新添加的源文件中,创建一个新的 C++ 文件(main.cpp),用于编写 JNI 代码。
5、在 CMakeLists.txt 文件中,添加 OpenCV 的路径和库文件。
cmake_minimum_required(VERSION 3.4.1) add_library(native-lib SHARED IMPORTED) set_target_properties(native-lib PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/cpp/native-lib.so) find_library(log-lib log-lib) target_link_libraries(native-lib ${log-lib} ${OpenCV_LIBS})
6、在你的 app 的 build.gradle 文件中,添加对 C++ 支持的配置:
android { ... defaultConfig { ... externalNativeBuild { cmake { path "CMakeLists.txt" version "3.10.2" // 根据你的 NDK 版本选择合适的 CMake 版本 } } } ... }
四、编写 JNI 代码
1、在 main.cpp 中,编写 JNI 代码,调用 OpenCV 的函数。
#include <jni.h> #include <opencv2/opencv.hpp> #include <vector> #include <string> #include <android/log.h> #define LOG_TAG "JNI_OpenCV" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) using namespace cv; extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapp_MainActivity_processImage(JNIEnv *env, jobject thiz, jstring inputImagePath) { // 在这里调用 OpenCV 函数处理图像,并返回结果字符串。 Mat img = imread(env->GetStringUTFChars(inputImagePath, 0)); //读取图片文件流信息并存储到Mat对象img中;如果读取成功则返回非空的img;否则返回空的img;如果文件不存在或者打不开,则返回空矩阵;如果读取错误则返回NULL;参数:inputImagePath是图片路径;返回值:读取的图片信息;使用方式:img = imread("test.jpg", IMREAD_COLOR); //读取图片文件流信息并存储到Mat对象img中;如果读取成功则返回非空的img;否则返回空的img;如果文件不存在或者打不开,则返回空矩阵;如果读取错误则返回NULL;参数:inputImagePath是图片路径;返回值:读取的图片信息;使用方式:img = imread("test.jpg", IMREAD_COLOR); //读取图片文件流信息并存储到Mat对象img中;如果读取成功则返回非空的img;否则返回空的img;如果文件不存在或者打不开,则返回空矩阵;如果读取错误则返回NULL;参数:inputImagePath是图片路径;返回值:读取的图片信息;使用方式:img = imread("test.jpg", IMREAD_COLOR); //读取图片文件流信息并存储到Mat对象img中;如果读取成功则返回非空的img;否则返回空的img;如果文件不存在或者打不开,则返回空矩阵;如果读取错误则返回NULL;参数:inputImagePath是图片路径
版权声明
本文仅代表作者观点,不代表米安网络立场。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。