Linux 拨号vps windows公众号手机端

在 Android Studio 中使用 JNI (Java Native Interface) 编译 OpenCV 是一个相对复杂的过程,涉及到多个步骤。以下是一个详细的指南,帮助你从零开始设置并编译包含 OpenCV 的 Android 应用。

lewis 3年前 (2023-02-01) 阅读数 8 #资讯

一、前期准备

在开始之前,确保你已经安装了 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是图片路径
版权声明

本文仅代表作者观点,不代表米安网络立场。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门