android ndk 架构,NDK需要特别注意的armeabi等架构问题
我們在編寫NDK時候,有時候需要依賴第三方so庫,如ffmpeg。
如果這里配置的是多種架構(gòu):
externalNativeBuild {
cmake {
cppFlags ""
//生成.so庫的目標平臺
abiFilters 'armeabi','armeabi-v7a'
}
}
假如cmakeList.txt配置如下,則會生成 兩個libless.so庫,并分別存在
armeabi和 armeabi-v7 目錄下。
cmake_minimum_required(VERSION 3.4.1)
#源碼樹的頂層路徑。
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編譯器,則在編譯選項中加入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")
# 個人庫
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)庫
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 )
# 第三方庫
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
開發(fā)的時候,NDK雖然依賴其他的so,但是它只會生成我們自己的so并放在相應(yīng)架構(gòu) 的目錄中,其他的so它不會管的也管不著。我們CmakeList.txt依賴的so庫是可以放在任何地方的(D盤,F盤都行),但這里為了不用構(gòu)建apk時候 重復(fù)拷貝 就直接放在了armeabi下,那么打包的時候就出現(xiàn)了上面的情景。
Paste_Image.png
所以說: 平常建議 依賴第三方的so庫 的架構(gòu) 要和 我們自己構(gòu)建的 so庫 架構(gòu) 一致 ,
要么都是只有一個armeabi,要么都是兩個 armeabi和armeabi-v7
開發(fā)建議
Paste_Image.png
armeabi 改為${ANDROID_ABI}來根據(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來指定的。
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庫的目標平臺
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'])
}
總結(jié)
以上是生活随笔為你收集整理的android ndk 架构,NDK需要特别注意的armeabi等架构问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: POJ 1523 SPF (割点 点双
- 下一篇: jsp:setProperty
