前言:
如果想借用TNN自己写一个库(比如exp.so), 通常我们选用TNN的静态库(libTNN.a),
因为使用静态库后自己生成的库文件就一个exp.so
如果使用动态库(libTNN.so)那么自己生成的库文件就有两个了: libTNN.so和exp.so

TNN安卓库编译

环境:
    源码: https://github.com/Tencent/TNN/archive/refs/tags/v0.3.0.zip
    c++编译器: "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
    cmake: cmake-3.20.4-windows-x86_64.zip
    android ndk: android-ndk-r20b-windows-x86_64.zip

1.解压/安装上面各个包
2.新建xxx.bat, 写入以下内容:(以下编译的是arm64-v8a, 静态库)

::功能: 在windows下编译tnn for androidcall "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
::set VS_CL_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\Hostx86\x64
::set PATH=%PATH%;%VS_CL_PATH%set TNN_ROOT=D:\code\TNN\TNN-0.3.0
set CMAKE_BIN=D:\development_kits\cmake-3.20.4-windows-x86_64\bin
set ANDROID_NDK=D:\development_kits\android-ndk-r20b
::set ABIA32=armeabi-v7a
set ABIA32=arm64-v8a
:: SHARED_LIB ON表示动态库, OFF表示静态库
set SHARED_LIB=OFFset PATH=%PATH%;%CMAKE_BIN%
if "%SHARED_LIB%" == "ON" (set MODE=share
) else if "%SHARED_LIB%" == "OFF" (set MODE=static
) else (echo unknown model with SHARED_LIB: %SHARED_LIB%. exit.pauseexit
)cd %TNN_ROOT%
mkdir build_android
cd build_android
mkdir %MODE%
cd %MODE%
mkdir %ABIA32%
cd %ABIA32%cmake -G "Unix Makefiles" ^
-DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK%/build/cmake/android.toolchain.cmake ^
-DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%/prebuilt/windows-x86_64/bin/make.exe" ^
-DDEBUG:BOOL=OFF ^
-DANDROID_ABI="%ABIA32%" ^
-DANDROID_STL=c++_static ^
-DANDROID_NATIVE_API_LEVEL=android-14 ^
-DANDROID_TOOLCHAIN=clang ^
-DBUILD_FOR_ANDROID_COMMAND=true ^
-DTNN_CPU_ENABLE:BOOL=ON ^
-DTNN_ARM_ENABLE:BOOL=ON ^
-DTNN_HUAWEI_NPU_ENABLE:BOOL=OFF ^
-DTNN_OPENCL_ENABLE:BOOL=ON ^
-DTNN_BENCHMARK_MODE:BOOL=OFF ^
-DTNN_TEST_ENABLE:BOOL=ON ^
-DTNN_OPENMP_ENABLE:BOOL=ON ^
-DSHARING_MEM_WITH_OPENGL=0 ^
-DTNN_BUILD_SHARED:BOOL=%SHARED_LIB% %TNN_ROOT%cmake --build . -j4
cmd.exe /k

3.双击编译成功
4.总结
    1.用的是vs2019的c++编译器, vs2017 vs2013应该也行
    2.cmake指令选项参考官方scripts/build_android.sh
    3.目前只测试arm64-v8a成功, 对于armeabi-v7a平台(属于32位arm), 不知道能不能用, 可能需要搭配32位的vs编译器(vcvars32.bat)?

android studio ndk工程调用

android studio环境
    android studio: 4.2.2
    buildToolsVersion “30.0.2”
    ndkVersion "20.0.5594570"
以上buildToolsVersion和ndkVersion最好在build.gradle中指明:

android {compileSdkVersion 30buildToolsVersion "30.0.2"
//    ndkVersion "21.4.7075529" // android studio 4.2 默认ndk版本, 搭配android-ndk-r20b生成的libTNN.a build成功报警告, run app失败ndkVersion "20.0.5594570" // 搭配android-ndk-r20b生成的libTNN.a build成功报警告, run app成功
//    ndkVersion "16.1.4479499" // 搭配android-ndk-r20b生成的libTNN.a build失败...
}

1.新建android studio native c++工程
2.写好各种所需要的java和cpp代码
3.在CMakeLists.txt中加入对TNN链接库的链接和头文件引用
    引用头文件:

include_directories(${TNN_ROOT}/include)

只针对arm64-v8a和armeabi-v7a平台(TNN android只编译了这两种平台):

if((ANDROID_ABISTREQUAL"arm64-v8a")OR(ANDROID_ABISTREQUAL"armeabi-v7a"))

导入TNN库:

#=== 导入TNN库libTNN.so/libTNN.a
add_library (tnn ${LIB_MODE} IMPORTED)
if("${LIB_MODE}" STREQUAL "SHARED")set(LIB_TNN_FILE libTNN.so)
endif()
if("${LIB_MODE}" STREQUAL "STATIC")set(LIB_TNN_FILE libTNN.a)
endif()
set_target_properties(tnn PROPERTIES IMPORTED_LOCATION ${TNN_ROOT}/build_android/${LIB_MODE}/${ANDROID_ABI}/${LIB_TNN_FILE})

链接TNN库:

    #=== 将TNN库与目标文件链接. -fopenmp和-Wl,--whole-archive tnn -Wl,--no-whole-archive是gcc的编译选项#=== 添加动态链接库jnigraphics解决AndroidBitmap_getInfo报错#=== 添加fopenmp解决undefined reference to '__kmpc_fork_call错误 参考https://github.com/Tencent/ncnn/issues/292if("${LIB_MODE}" STREQUAL "STATIC")target_link_libraries( # Specifies the target library.native-lib-ljnigraphics-fopenmp-Wl,--whole-archive tnn -Wl,--no-whole-archivetnn)endif()if("${LIB_MODE}" STREQUAL "SHARED")target_link_libraries( # Specifies the target library.native-lib-ljnigraphicstnn)endif()

完整的CMakeLists.txt:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.10.2)# Declares and names the project.project("tnn")set(TNN_ROOT D:/code/TNN/TNN-0.3.0)
include_directories(${TNN_ROOT}/include)
include_directories(${CMAKE_SOURCE_DIR}/)
set(LIB_MODE STATIC) # STATIC表示使用libTNN.a, SHARED表示使用libTNN.soif((ANDROID_ABI STREQUAL "arm64-v8a") OR (ANDROID_ABI STREQUAL "armeabi-v7a"))#=== 导入TNN库libTNN.so/libTNN.aadd_library (tnn ${LIB_MODE} IMPORTED)if("${LIB_MODE}" STREQUAL "SHARED")set(LIB_TNN_FILE libTNN.so)endif()if("${LIB_MODE}" STREQUAL "STATIC")set(LIB_TNN_FILE libTNN.a)endif()set_target_properties(tnn PROPERTIES IMPORTED_LOCATION ${TNN_ROOT}/build_android/${LIB_MODE}/${ANDROID_ABI}/${LIB_TNN_FILE})#=== 编译写好的接口, 生成链接文件file(GLOB_RECURSE TNN_WRAPPER_SRCS ${CMAKE_SOURCE_DIR}/*.cc)    # 包含TNN的代码file(GLOB_RECURSE OTHER_SRCS ${CMAKE_SOURCE_DIR}/*.cpp)         # 不包含TNN的代码add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).${TNN_WRAPPER_SRCS} ${OTHER_SRCS})#=== 将TNN库与目标文件链接. -fopenmp和-Wl,--whole-archive tnn -Wl,--no-whole-archive是gcc的编译选项#=== 添加动态链接库jnigraphics解决AndroidBitmap_getInfo报错#=== 添加fopenmp解决undefined reference to '__kmpc_fork_call错误 参考https://github.com/Tencent/ncnn/issues/292if("${LIB_MODE}" STREQUAL "STATIC")target_link_libraries( # Specifies the target library.native-lib-ljnigraphics-fopenmp-Wl,--whole-archive tnn -Wl,--no-whole-archivetnn)endif()if("${LIB_MODE}" STREQUAL "SHARED")target_link_libraries( # Specifies the target library.native-lib-ljnigraphicstnn)endif()
else()#=== 编译不包含TNN的接口, 生成链接文件file(GLOB_RECURSE OTHER_SRCS ${CMAKE_SOURCE_DIR}/native-lib.cpp) # 不包含TNN的代码add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).${OTHER_SRCS})
endif()#=== log-lib是工程建立后默认就有的
#=== 似乎用来在android中打印cpp代码的log
#=== 参考https://stackoverflow.com/questions/4629308/any-simple-way-to-log-in-android-ndk-code
find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log )target_link_libraries( # Specifies the target library.native-lib# Links the target library to the log library# included in the NDK.${log-lib} )

关于android studio下调用tnn的so/a库详细内容可以看这里https://blog.csdn.net/ying86615791/article/details/119828457

win下编译TNN安卓库(静态或者动态) + android studio ndk调用相关推荐

  1. And roid下编译自己的库文件 jar并在应用中调用

    android编译系统的makefile文件Android.mk写法如下 (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要 ...

  2. Windows10下编译NCNN安卓NDK

    前言 在做安卓端的目标识别相关项目,用到YoloV5,原本只用OpenCV的DNN来做模型推理,但速度达不到要求,所以转向移动端推理加速库,试了mnn.PaddlePaddle,ncnn,做了对比,最 ...

  3. linux如何编译boost指定库,linux下编译安装boost库

    linux下编译安装boost库 先看一下系统环境 Linux o-pc 3.19.0-22-generic #22-Ubuntu SMP Tue Jun 16 17:15:15 UTC 2015 x ...

  4. CentOS7下编译安装libmodbus库

    CentOS7下编译安装libmodbus库 下载libdmodbus源代码 编译安装lidmodbus 测试 参考资料 下载libdmodbus源代码 libmodbus官网下载页面如下图所示: 可 ...

  5. android studio ndk HelloWorld 编译环境搭建

    android studio NDK helloworld 项目 第一步 android studio ndk 编译环境搭建 http://yunpan.cn/c3cCxxgwrqDaL 访问密码 6 ...

  6. Android studio项目调用SO库

    Android studio项目调用SO库 Android studio创建Native C++工程 下载Native C++工程编译工具 新建native c++工程 native C++工程目录结 ...

  7. windows下编译skia和svg静态库

    最近引用duilib时发现使用gdi+绘制有很多问题,之前做浏览器时使用skia库,决定把底层绘制用skia替换,并且用skia的svg模块支持矢量图绘制.下面记录skia库的下载和编译 官方文档: ...

  8. iOS架构-c++工程在Mac下编译成.a库并调用(12)

    请先了解:xcode生成静态库文件.a 前言: 有时侯需要使用c++的一些代码库,这里先讲一下用Xcode 建C++ 工程,并将代码编译成.a库,提供给demo使用.这里只是简单的介绍,以后会继续介绍 ...

  9. android源码环境下编译fourthling.cling库的依赖问题

    记录下,编译fourthline.cling静态库的依赖问题. 1,因为需要在android的源码环境下调试依赖cling的投屏,需要将fourthline.cling编译为静态库. 首先预制依赖的. ...

  10. linux编译pcre生成动态链接库,Linux下编译安装PCRE库

    最近在学习nginx,nginx rewrite依赖于PCRE库,所以需要在linux系统中编译安装PCRE库.具体步骤如下: 1.下载PCRE包 首先去官网下载pcre的安装包 如果通过FTP的方式 ...

最新文章

  1. mysql临时表如何分页查询慢_数据量很大,分页查询很慢,怎么优化?
  2. 可变导向车道——为了缓解高峰压力的临时转向车道
  3. 调剂2002年计算机科学与技术,教育部关于做好2002年全国研究生录取工作的通知...
  4. 微信小程序-当用户拒绝了位置信息的请求时,提醒用户去设置地理位置授权
  5. 使用SQLiteHelper创建数据库并插入数据
  6. 块级元素的margin-left和margin-right的用法注意
  7. java用JDBC连接数据库的方式
  8. 与Claudia.js的作者Gojko Adzic谈论如何通过Claudia将Node.js微服务部署至AWS Lambda
  9. lol峡谷之巅区服务器位置,LOL: 论峡谷之巅和艾欧尼亚哪个区水平更高?
  10. 【图像隐写】基于matlab GUI DWT+DCT+SVD数字水印嵌入提取攻击(带面板)【含Matlab源码 1664期】
  11. 【数字信号调制】基于matlab GUI数字信号调制系统【含Matlab源码 1030期】
  12. 用MapX与C#开发地理信息系统
  13. bootstrap批量删除操作!
  14. [渝粤教育] 西安交通大学 土力学 参考 资料
  15. 经济学实证论文写作经验分享
  16. 数据库第6章总结——关系数据理论
  17. 精灵图在线测量,自动生成想要图片的宽高及位置
  18. 拦截器和过滤器的同异
  19. [附源码]SSM计算机毕业设计汽车租赁管理系统-JAVA
  20. 性能测试报告(实例)

热门文章

  1. 【层级多标签文本分类】MSML-BERT 模型的层级多标签文本分类方法研究
  2. 51单片机程序0到60计数个位逢5和6不显示,十位逢1不显示http://www.51hei.com/bbs/mcu-h24-1.html
  3. Linuxan安装-安装-centos7
  4. 机器人对话常用语模板_电话机器人的销售能力
  5. java怎么运行_java怎么运行
  6. PS光效插件 DFT 1.1.1.3汉化破解版,比灯光工厂更强大支持PSCC2019
  7. APU工业控制领域应用
  8. android 谷歌地图离线访问,谷歌升级Android版地图应用 支持离线使用
  9. python秩和比综合评价代码记录
  10. mtk java_MTK,mrp,JAVA你了解多少?