欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何在Android jni中使用OpenCV

程序员文章站 2024-03-21 20:59:34
...

这里仅介绍如何在jni中调用opencv,不涉及java层。

一、下载opencv for android

点击下载地址,下载合适的版本, 注意是选择android pack。

下载之后解压,放在合适的地方,我放在

如何在Android jni中使用OpenCV

二、环境配置

首先是在Android.mk中添加如下语句:

#OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

这两句是在编译的时候自动把opencv的依赖库拷贝到libs路径下。

然后我们以动态链接的方式加载opencv库:

OPENCV_LIB_TYPE :=SHARED

最后include opencv的mk:

include $(LOCAL_PATH)/../../../OpenCV-android-sdk/sdk/native/jni/OpenCV.mk

这里的路径和你放置opencv sdk的路径有关。

全部内容如下:

如何在Android jni中使用OpenCV

最后在Application.mk中加入如下语句,防止android不支持c的exception。

APP_CPPFLAGS := -fexceptions -frtti

三、测试

下面写一点简单的代码测试一下是否可以调用opencv 的API。

#include <opencv2/opencv.hpp>
#include "test.h"

#include <jni.h>
#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "JNITest"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

using namespace cv;
string getString()
{
    string str = "Get string from .so file!";
    Mat img = imread("/sdcard/test.jpg", -1);
    if(img.empty())
    {
        LOGE("faild to read.");
    }
    Mat grey;
    cvtColor(img,grey,CV_RGB2GRAY);
    if(grey.empty())
    {
        LOGE("faild to convert.");
    }
    int ret = imwrite("/sdcard/grey.jpg", grey);
    LOGE("ret = %d", ret);
    return str;
}

#undef LOG_TAG

这段代码从sdcard上读取一张rgb图像,转化成灰度图并写入sdcard。

访问sdcard需要在AndroidManifest.xml中加入如下语句:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

转化前:

如何在Android jni中使用OpenCV

转化后:

如何在Android jni中使用OpenCV

另外:在android虚拟机进行测试的时候,报错找不到libopencv_java3.so,但是apk里明明已经打包了这个so库。搞不懂为什么,只好手动adb push libopencv_java3.so到/system/lib/下,就可以成功运行了。在真机上测试的时候并没有报这个错误。