Android端部署NCNN

一、开发环境准备

1.1 本文开发环境版本对照表

工具 版本信息
Android Studio Hedgehog 2023.1.1 Patch 1
JDK JetBrains Runtime version 17.0.7
Gradle Version 8.2
Android Gradle Plugin Version 8.2.1
Kotlin 1.7.0

1.2 Java & Kotlin & Gradle 官方版本对照表:

docs.gradle.org/current/use...

1.3 新建一个Android Project

AndroidStudio中新建一个Native C++工程,C++ Standard选择的是C++ 11

Tips: Kotlin版本兼容问题

新建的Android Project由于一些本地的Gradle、Kotlin等配置差异,可能会存在Gradle、JDK、Kotlin版本不兼容导致APP构建失败,可以参考 版本信息对照表 修改一下版本号,列表中的版本都是相互兼容的,可以正常Build。默认新建项目时的Kotlin版本应该是1.9.x,与Gradle 8.2不兼容,因此此处像Kotlin版本改成了1.7.0(理论上小于等于1.8.20应该都行)

修改kotlin版本:

bash 复制代码
1) app/build.gradle.kts
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.7.0")  
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.0")

2) project/build.gradle.kts
id("org.jetbrains.kotlin.android") version "1.7.0" apply false

新建完的Project目录结构如下:(real-esrgan原名为nativa-lib, 我重命名过了)

连接真机调试:

第一阶段准备完毕🏆🏆🏆

二、NCNN部署

2.1 下载ncnn动态库

github.com/Tencent/ncn...

说明:-shared结尾的是动态库(.so),不带-shared是的静态库(.a)Adnroid端一般使用动态链接库(so库),然后通过JNI在Java层调用

2.2 将ncnn资源拷贝到项目中

1) 拷贝libncnn.so

在app/libs目录下新建需要的ABI父文件夹,然后将解压后的不同ABI目录下的libncnn.so拷贝到对应的目录下

2) 拷贝ncnn库文件

将解压后的任意一个ABI类型的下的 include 文件夹拷贝到 app/src/mian/cpp

2.3 修改JNI相关代码

1) 修改 CMakeLists.txt

bash 复制代码
cmake_minimum_required(VERSION 3.22.1)  
  
project("realesrgan")  
  
# 打印 ANDROID_ABI 以调试  
message(STATUS "ANDROID_ABI: ${ANDROID_ABI}")  
  
# 包含头文件  
include_directories(${CMAKE_SOURCE_DIR})  
include_directories(${CMAKE_SOURCE_DIR}/include)  
  
# 引入 ncnn 动态库  
add_library(ncnn SHARED IMPORTED)  
set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI}/libncnn.so)  
# ../ 是一个相对路径符号,用于表示当前目录的上级目录,务必要和项目中的libncnn.so文件路径对应上
  
# 添加你的本地库  
add_library(${CMAKE_PROJECT_NAME} SHARED real-esrgan.cpp)  
  
# 链接库  
target_link_libraries(  
        ${CMAKE_PROJECT_NAME}  
        ncnn  
        android  
        log  
)

2) 修改 app/build.gralde.kts

javascript 复制代码
android {
    defaultConfig{ ... }
    ...
    
    //新增的内容
    sourceSets {  
        getByName("main") {  
            jniLibs.srcDirs("libs")  
        }  
    }
}

3) Sync 一下项目,然后 Run 'app'

2.4 常见错误

r 复制代码
* What went wrong:
Execution failed for task ':app:buildCMakeDebug[arm64-v8a]'.
> com.android.ide.common.process.ProcessException: ninja: Entering directory 
`E:\Project\RealESRGAN\app\.cxx\Debug\1j5l121y\arm64-v8a'
C++ build system [build] failed while executing: @echo off "D:\\AndroidSdk\\sdk\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "E:\\Project\\RealESRGAN\\app\\.cxx\\Debug\\1j5l121y\\arm64-v8a" ^ realesrgan from E:\Project\RealESRGAN\app 
ninja: error: 'E:/Project/RealESRGAN/app/src/main/libs/arm64-v8a/libncnn.so', needed by 'E:/Project/RealESRGAN/app/build/intermediates/cxx/Debug/1j5l121y/obj/arm64-v8a/librealesrgan.so', missing and no known rule to make it 
* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

根据错误信息,问题在于CMake无法找到libncnn.so文件,需要检查CMakeLists.txt中指定的库文件路径是否正确

第二阶段部署完毕🏆🏆🏆

三、验证

//todo

相关推荐
Bryce李小白5 分钟前
Flutter实现Android原生相机拍照
android·数码相机·flutter
初学者-Study6 分钟前
Android基础(一) 运行HelloWorld
android·helloworld·模拟器运行
BUG创建者1 小时前
openlayer根据不同的状态显示不同的图层颜色
android·java·javascript
用户2018792831671 小时前
浅谈画框ImageView的background和src属性的差异
android
2501_915909061 小时前
iOS 加固工具实战解析,主流平台审核机制与工具应对策略
android·ios·小程序·https·uni-app·iphone·webview
马 孔 多 在下雨2 小时前
安卓服务与多线程
android
2501_915106324 小时前
iOS WebView 调试实战,第三方脚本加载失败与内容安全策略冲突问题排查指南
android·ios·小程序·https·uni-app·iphone·webview
消失的旧时光-19434 小时前
Android 键盘
android·键盘监听
Jackilina_Stone18 小时前
【faiss】用于高效相似性搜索和聚类的C++库 | 源码详解与编译安装
android·linux·c++·编译·faiss
棒棒AIT18 小时前
mac 苹果电脑 Intel 芯片(Mac X86) 安卓虚拟机 Android模拟器 的救命稻草(下载安装指南)
android·游戏·macos·安卓·mac