【ncnn android】算法移植(九)——DBface android移植

這裏主要記錄將DBface移植到android平臺上的記錄。

1. requirements

  • 192.7142,android studio的版本
  • ndk的版本爲:19.2.5345600是不行的,21.1.6352462

2. 其他

  1. android安裝apk的時候,“安裝異常”
    在"project"—“android”----“Gradle Scripts”—"gradle.properties"中加入一句android.injected.testOnly=false
    在這裏插入圖片描述
  2. 項目中cmake文件的寫法
cmake_minimum_required(VERSION 3.4.1)

#include頭文件目錄
include_directories(include)		// ncnn的頭文件

#source directory源文件目錄
file(GLOB MTCNN_SRC *.h *.cpp *.c)		// 項目源文件
set(MTCNN_COMPILE_CODE ${MTCNN_SRC})


#添加ncnn庫
add_library(libncnn STATIC IMPORTED )
set_target_properties(libncnn
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libncnn.a)

#編譯爲動態庫
add_library(mtcnn SHARED ${MTCNN_COMPILE_CODE})		// java中用mtcnn庫就可以調用jni函數了

#添加工程所依賴的庫
find_library(  log-lib log )
target_link_libraries( mtcnn
        libncnn
        android
        jnigraphics
        z
        ${log-lib} )
  1. 在jni.cpp中需要將模型聲明爲static
    static DBface *dBface;或者static ncnn::Net model

  2. android項目build.gradle的寫法

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.example.ncnntest1"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_TOOLCHAIN=clang"
                cFlags "-fopenmp -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math "
                cppFlags "-fopenmp -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math "
                arguments "-DANDROID_STL=c++_shared", "-DANDROID_CPP_FEATURES=rtti exceptions"
                cppFlags ""
                cppFlags "-std=c++14"
                cppFlags "-frtti"
                cppFlags "-fexceptions"
            }
        }
        ndk {
            abiFilters 'armeabi-v7a'// , 'arm64-v8a' //,'x86', 'x86_64', 'armeabi'
            stl "gnustl_static"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
  • ndk設置了處理器的內核類型。'armeabi-v7a'
  1. 改app的名字
    在這裏插入圖片描述

  2. 在寫c++推理代碼的時候,注意入口參數爲ncnn::Mat,不要用cv::Mat。所以需要在調用前把數據整理好。

  3. 看很多ncnn android例子都是在java中讀取模型之後傳入c++。而官方的例子,是在c++中載入模型,這樣更有利於前後端分離。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章