通过安卓NDK调用opencv4android 并通过adb shell 测试生成的二进制文件

Pre-requisite:

1. Opencv4android 2.4.11 在官网下载

2. 获取了root权限的安卓设备

3. adb shell

4. 安卓 NDK R10e (不建议使用R14 ,坑多)

Goals:

1. 通过NDK 调用Opencv4android 里面的静态库,

2, 通过NDK生成基于arm 64 平台的可执行文件

3. 在安卓平台下测试。

Steps:

1. 首先建立一个文件夹,假设为myfolder

2. 进入到myfolder, 建立一个文件夹,取名为jni

3. 进入jni文件夹,

4,建立三个文件,名字分别为 Android.mk, Application.mk, name.cpp。 其中name.cpp 是我们要测试的文件。

我的测试文件如下:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>

using namespace std;
int main(int argc, char** argv)
{
    cout<<"doodle"<<endl;
    cv::Mat m(3, 5, CV_32FC1, 1);
    cv::Mat image= cv::imread("1.jpg");
    cout<<m<<endl;
    cout<<image<<endl;

}

可见这里我们测试了两个opencv基本功能,一个是cv::Mat 类型,另外一个是cv::imread函数, adb shell 环境内好像不能使用imshow,这里我们使用cout打印图像。

5. 编写Android.mk:

我们将opencv4android 解压后,进入解压目录,进入sdk/native/libs/

之后选择对应平台,在这里我们使用的是64位安卓平台,所以使用的是arm64-v8a下的静态库,我们将需要的静态库放置到jni文件夹内

LOCAL_PATH := $(call my-dir) //设置当前路径
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
APP_ALLOW_MISSING_DEPS=true
CPP_EXTENSION= .cxx .cpp//设置cpp文件后缀

include $(CLEAR_VARS)//每一个模块前需要声明

OPENCV_LIB_TYPE := static

include /home/shr/software/temp_folder/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk

LOCAL_C_INCLUDES += /home/shr/software/temp_folder/OpenCV-android-sdk/sdk/native/jni/include

LOCAL_MODULE := shitss

LOCAL_SRC_FILES := name.cpp //需要编译的源文件
LOCAL_CFLAGS :
= -Werror -O3 -ffast-math

LOCAL_STATIC_LIBRARIES += core //注意这里是 “+”
LOCAL_LDLIBS += -llog -ldl include $(BUILD_EXECUTABLE) //声明我们的需求,这里我们生成静态库

6.编写Application.mk

APP_CPPFLAGS += -frtti -fexceptions -std=c++11 

APP_PLATFORM := android-15

APP_STL += gnustl_static //声明c++支持
#APP_STL += c++_static

APP_ABI := arm64-v8a //声明平台,与所使用的静态库架构一致

7.在jni文件夹内使用ndk-build,例如

s@s: ~/software/temp_folder/opencvtest/jni$ /home/s/software/android-ndk-r10e/ndk-build //也可以设置NDK环境变量,不过我觉得麻烦

8.之后生成的可执行文件在jni的平级目录中的libs中可以找到。

9. 将安卓装备链接电脑,首先获得超级权限:

sudo -s

之后重启adb服务:

adb kill-server
adb start-server

输入:

adb shell

进入安卓环境, 另打开一个terminal, 使用如下命令

adb push <path> /path_in_android_device/   
上一步是将生成的可执行文件push到安卓产品中,我们再将1.jpg push到相同文件夹。
之后需要使用 mv 命令将两个文件移动到data/下, 因为对于我的机器来说我不能直接将文件push到data/下,所以只能push到sdcard下,但是sdcard环境下不能执行文件,所以我需要再移动到data文件夹下。

将文件mv到data/目录后先给可执行文件增加权限,

这里直接

chmod 777 filename

之后./filename即可运行,屏幕不出意外是一堆数字

原文地址:https://www.cnblogs.com/SongHaoran/p/7161925.html