NDK需要特別注意的armeabi等架構(gòu)問(wèn)題

我們?cè)诰帉?xiě)NDK時(shí)候,有時(shí)候需要依賴第三方so庫(kù),如ffmpeg。

如果這里配置的是多種架構(gòu):

 externalNativeBuild {
            cmake {
                cppFlags ""
                //生成.so庫(kù)的目標(biāo)平臺(tái)
                abiFilters 'armeabi','armeabi-v7a'
            }
        }

假如cmakeList.txt配置如下,則會(huì)生成 兩個(gè)libless.so庫(kù),并分別存在
armeabi和 armeabi-v7 目錄下。

cmake_minimum_required(VERSION 3.4.1)

#源碼樹(shù)的頂層路徑。
set(distribution_DIR ${PROJECT_SOURCE_DIR}/src/main/jniLibs)

# 查看gradle Console 調(diào)試信息 PROJECT_SOURCE_DIR => E:/Codes/android_code/TPlayer/ffmpeg
message(STATUS "========> the PROJECT_SOURCE_DIR is : ${PROJECT_SOURCE_DIR}")
message(STATUS "========> the PROJECT_BINARY_DIR is : ${PROJECT_BINARY_DIR}")
message(STATUS "========> the cmakeList.txt PATH is : ${CMAKE_CURRENT_SOURCE_DIR}")
message(STATUS "========> distribution_DIR is : ${distribution_DIR}")

#判斷編譯器類型,如果是gcc編譯器,則在編譯選項(xiàng)中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
    message(STATUS "optional:-std=c++11")
endif(CMAKE_COMPILER_IS_GNUCXX)

#支持-std=gnu++11
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

# 個(gè)人庫(kù)
add_library( # Sets the name of the library.
             less

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp
             )
# 系統(tǒng)庫(kù)
find_library( # Sets the name of the path variable.
              log-lib
              log )

find_library( # Sets the name of the path variable.
              z-lib
              z )

find_library( # Sets the name of the path variable.
              android-lib
              android )

# 第三方庫(kù)
add_library(avcodec-57 SHARED IMPORTED)
set_target_properties(avcodec-57 PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/armeabi/libavcodec-57.so)

add_library(avfilter-6 SHARED IMPORTED)
set_target_properties(avfilter-6 PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/armeabi/libavfilter-6.so)

add_library(avformat-57 SHARED IMPORTED)
set_target_properties(avformat-57 PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/armeabi/libavformat-57.so)

add_library(avutil-55 SHARED IMPORTED)
set_target_properties(avutil-55 PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/armeabi/libavutil-55.so)

add_library(swresample-2 SHARED IMPORTED)
set_target_properties(swresample-2 PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/armeabi/libswresample-2.so)

add_library(swscale-4 SHARED IMPORTED)
set_target_properties(swscale-4 PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/armeabi/libswscale-4.so)

add_library(avdevice-57 SHARED IMPORTED)
set_target_properties(avdevice-57 PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/armeabi/libavdevice-57.so)

include_directories(${PROJECT_SOURCE_DIR}/src/main/jniLibs/include)
target_link_libraries(
                       less avcodec-57 avfilter-6 avformat-57 avutil-55 swresample-2 swscale-4 avdevice-57

                       ${log-lib}
                       ${z-lib}
                       ${android-lib}
                       )
Paste_Image.png

開(kāi)發(fā)的時(shí)候,NDK雖然依賴其他的so,但是它只會(huì)生成我們自己的so并放在相應(yīng)架構(gòu) 的目錄中,其他的so它不會(huì)管的也管不著。我們CmakeList.txt依賴的so庫(kù)是可以放在任何地方的(D盤(pán),F(xiàn)盤(pán)都行),但這里為了不用構(gòu)建apk時(shí)候 重復(fù)拷貝 就直接放在了armeabi下,那么打包的時(shí)候就出現(xiàn)了上面的情景。

Paste_Image.png

所以說(shuō): 平常建議 依賴第三方的so庫(kù) 的架構(gòu) 要和 我們自己構(gòu)建的 so庫(kù) 架構(gòu) 一致 ,

要么都是只有一個(gè)armeabi,要么都是兩個(gè) armeabi和armeabi-v7

開(kāi)發(fā)建議

Paste_Image.png

armeabi 改為${ANDROID_ABI}來(lái)根據(jù)${ANDROID_ABI}選擇依賴。

add_library(myjpeg SHARED IMPORTED)
set_target_properties(jpeg PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libjpeg.so)

${ANDROID_ABI}是根據(jù)gradle中聲明的abiFilters來(lái)指定的。

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 14
        versionCode 1
        versionName "1.0"
        externalNativeBuild {
            cmake {
                cppFlags ""
                //生成.so庫(kù)的目標(biāo)平臺(tái)
                abiFilters 'armeabi','armeabi-v7'
            }
        }
    }
    buildTypes {
        debug {
            minifyEnabled false
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path 'CMakeLists.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容