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

  • 相关阅读:
    爬虫-scrapy初试
    python-爬虫day1
    django 内存地址列表-->转换为-->字典
    django 基于 form 验证 确认密码的注册
    django 请求过程,生命周期
    django7 models 高级应用
    django6-项目练习
    Mysql之起始
    python之IO模型
    python模块之Gevent(协程)
  • 原文地址:https://www.cnblogs.com/SongHaoran/p/7161925.html
Copyright © 2020-2023  润新知