日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, 靜態庫)

::功能: 在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调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。