win下编译TNN安卓库(静态或者动态) + android studio ndk调用
前言:
如果想借用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, 靜態庫)
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中指明:
1.新建android studio native c++工程
2.寫好各種所需要的java和cpp代碼
3.在CMakeLists.txt中加入對TNN鏈接庫的鏈接和頭文件引用
?? ?引用頭文件: ?
? ? 只針對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调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis服务器端和客户端启动
- 下一篇: 从零开始学电脑知识