NCNN官方例子操作流程
NCNN官方:
官方例子
1.安装Android Studio
默认安装,修改地址到D盘,若遇到unable to access android sdk add-on list 点击cancel默认安装即可
1.1打开Android Studio,下载相关包
File-setting-Appearance&Behavior-System Setting-Android SDK
Android SDK Locations地址先修改
image-20210611173454493.png注:如果一开始忘记修改地址,已经下载包后更改地址方法如下:
-
ndk的项目从C:\Users\jerry\AppData\Local\Android\Sdk\ndk剪切到D:\Android\Sdk\ndk (不然下一步会报错,缺少内容)
-
File-Other Settings-Default Project Structure,修改Android SDK location跟JDK location
SDK Platforms选择:
-
Android API 30 # 30 为安卓最新版11.0
-
Android 7.0(Nougat)
SDK tools选择:
image-20210611173204674.png然后勾上Show Package Details
-
NDK选择21.3.6528147
-
Cmake选择3.10.2.4988404
2.下载官方例子
git clone https://github.com/nihui/ncnn-android-scrfd
3.查看app/src/main/jni/CMakeLists.txt
project(scrfdncnn)
cmake_minimum_required(VERSION 3.10)
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.5.1-android/sdk/native/jni)
find_package(OpenCV REQUIRED core imgproc)
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20210525-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)
add_library(scrfdncnn SHARED scrfdncnn.cpp scrfd.cpp ndkcamera.cpp)
target_link_libraries(scrfdncnn ncnn ${OpenCV_LIBS} camera2ndk mediandk)
官方配置:
-
opencv-mobile-4.5.1-android
-
ncnn-20210525-android-vulkan
如果没有此文件,自己创建:
-
项目名等要改变;
-
add_library()内的文件根据jni里修改,所有cpp文件都要写进去
-
在app文件夹下建立build文件夹,并进入进行cmake
cd app && mkdir build
cd build && cmake ..
4.下载ncnn-android-vulkan.zip
根据CMakeLists.txt,下载ncnn-20210525-android-vulkan
下载地址为:https://github.com/Tencent/ncnn/releases
编译版本,默认配置,android-ndk-r21d,xcode 12.2,ubuntu-16.04,ubuntu-18.04,ubuntu-20.04,vs2017,vs2019
5.下载opencv-mobile-XYZ-android.zip
根据CMakeLists.txt,下载opencv-mobile-4.5.1-android
下载地址为:https://github.com/nihui/opencv-mobile
可下载其他版本,但CMakeLists.txt的配置信息需要更改,
注意:(armeabi-v7a, arm64-v8a, x86, x86_64) build with ndk r21d and android api 24,即在build.gradle文件中设置minSdkVersion 不能小于24.即设备安卓系统必须7以上, 安卓6不能使用.
6.用andriod Studio打开项目
6.1 File-Sync Project with Gradle Files 进行文件检查
6.2文件检查没问题,Build-Make Project,生成项目
6.2- 如果只编译C++代码
image-20210801164153193.png在2020.3的版本为:
image-20210801231636112.png6.3Run - run app
-
如果用实际手机,手机需连上电脑后,打开开发者模式
-
如果用虚拟安卓机,设置:
设置虚拟机保存地址,默认在C:\Users\用户名.android/avd,其中安卓包里有一个Pixel_2_API_30.ini为指向文件,(如果未设置环境变量,只移动安卓包,那这个文件应该保留在这里).设置环境变量,新建环境变量的系统变量,变量名为“ANDROID_AVD_HOME”,变量值为存模拟器的地址
下拉,选择Open AVD manager,选择Create Virtual Device,选择分辨率跟安卓版本,
image-20210611174752826.png image-20210611175011432.png如果模拟器,需要用到摄像头,在Android Virtual Device Manager选择对应的模拟器,修改-Show Advanced Settings-Camera,Front与Back都选择Webcam0,即电脑的摄像头.
image-20210611184344702.png7.app命名
直接在文件AndroidManifest.xml中的android:label=”@string/app_name”去修改即可,直接去修改app_name中的名字,中、英文都是可以的;
img注意:项目的versionName、versionCode若需要修改,可以直接去build.gradle中去修改,然后重新编译即可,不要去清单文件AnddroidManifest.xml中修改,因为那样是没有任何作用的。
8.app图标
AndroidMenifest.xml中指定了该APP的图标:android:icon="@mipmap/ic_launcher"
imgmipmap/ic_launcher”对应了“应用程序名/app/src/main/res”中的多个以“mipmap”开头的文件夹,如图
img2.1 hdpi、mdpi、xhdpi、xxhdpi和xxxhdpi的区别 以上五个文件夹对应了不同屏幕密度下使用的图标。屏幕密度简称DPI,其全称为“Dots Per Inch”,表示“每英寸的像素点”,该值越大显示的图标则越清晰。
anydpi-v26 待整理;
hdpi表示屏幕密度是160;
hdpi表示屏幕密度是240;
xhdpi表示屏幕密度是320;
xxhdpi表示屏幕密度是480;
xxxhdpi表示屏幕密度是640。
不同文件夹下,保存了不同屏幕密度的图标;可以通过两种方式修改APP的图标,一种是修改图标资源;另一种是修改图标资源值。
2.2 通过修改 (图标资源)实现图标的修改 将APP的新图标名修改为“ic_launcher.png”,之后将其拷贝到“1.1 hdpi、mdpi、xhdpi、xxhdpi和xxxhdpi的区别”中提到的5个文件夹中,覆盖之前的“ic_launcher.png”文件,之后运行程序即可实现APP图标的修改。
<实际操作没效果>
2.3 通过修改 (图标资源值) 实现图标的修改 在“1 修改APP图标”中提到的AndroidMenifest.xml中的“android:icon”指定的是APP图标资源,可以将其修改为其它值。例如,将APP新图标拷贝到drawable文件夹下,并将AndroidMenifest.xml修改
android:icon="@drawable/ic_launcher"
<实际操作有效>
2.4 修改anydpi-v26 待整理;
9.build.gradle设置
compileSdkVersion: 编译版本,真正决定代码是否能编译的关键,比如设置成23,就无法使用httpclient,低版本编译出来的apk可以在高版本上运行,因为向下兼容,高版本编译的apk运行到低版本,minSdkVersion的也没有问题,因为编译时就会考虑兼容性,低版本会有v4,v7这些兼容包
minSdkVersion: 最小支持版本,比如设置成15,就无法在低于15的版本运行
targetSdkVersion: 只是一个标示,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些,编译阶段没有实质性作用
buildToolsVersion: 编译工具的版本,一般设置为最新即可
兼容包得版本一般要配置跟编译版本一致,比如编译版本配置为23,v7兼容包也要配置为23,否则会出错
cmake设置
externalNativeBuild {
cmake {
// cppFlags ""
cppFlags "-std=c++11 -frtti -fexceptions" //设置标准跟是否支持try跟exceptions
arguments "-DANDROID_STL=c++_static" //支持STL静态库 ,默认
// arguments "-DANDROID_STL=c++_shared" //支持STL动态库
}
}
ndk编译版本设置
为生成的so文件支持平台.会存放在不同平台文件夹中
sourceSets {
main {
jniLibs.srcDirs = ['libs'] //寻找库文件地址添加进library
}
}