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即可运行,屏幕不出意外是一堆数字