【发布时间】:2023-03-05 05:11:01
【问题描述】:
我可以构建 hello-libs google 示例代码,并且预构建库已正确复制到目标 apk。
但在我的应用程序中,编译已通过,但 apk 不包含预构建库。
两个问题:
- 构建输出的apk lib目录只包含arm64版本,但是我在build.gradle中定义了armeabi、armeabi-v7a和arm64。不知道为什么它不生效。
lib/
└── arm64-v8a
└── libFFmpegWrapper.so
- prebuild 库根本不包含在 apk lib 目录中,但我的 build.gradle 中有 jniLibs 行,我检查了 hell-libs,看起来一样。
详细信息如下:
Android 工作室版本:3.0.1 操作系统:macosx 10.13.1
我的文件目录结构如下:
├── app
│ ├── libs
│ └── src
│ ├── main
│ │ ├── cpp
│ │ │ └── ffmpeg
│ │ │ ├── arm64-v8a
│ │ │ │ ├── bin
│ │ │ │ ├── include
│ │ │ │ ├── lib
│ │ │ ├── armeabi
│ │ │ │ ├── include
│ │ │ │ ├── lib
│ │ │ └── armeabi-v7a
│ │ │ ├── include
│ │ │ ├── lib
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── ffmpegtest
│ │ │ └── recorder
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.example.ffmpegtest"
minSdkVersion 23
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}
externalNativeBuild {
cmake {
cmake {
arguments '-DANDROID_PLATFORM=android-26',
'-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
}
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
// let gradle pack the shared library into apk
jniLibs.srcDirs = ['src/main/cpp/ffmpeg']
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
CMakeList.txt
cmake_minimum_required(VERSION 3.4.1)
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/src/main/cpp/ffmpeg)
add_library(avutil-55 SHARED IMPORTED)
set_target_properties(avutil-55
PROPERTIES IMPORTED_LOCATION
${FFMPEG_DIR}/${ANDROID_ABI}/lib/libavutil-55.so)
add_library(avformat-57 SHARED IMPORTED)
set_target_properties(avformat-57
PROPERTIES IMPORTED_LOCATION
${FFMPEG_DIR}/${ANDROID_ABI}/lib/libavformat-57.so)
add_library(avcodec-57 SHARED IMPORTED)
set_target_properties(avcodec-57
PROPERTIES IMPORTED_LOCATION
${FFMPEG_DIR}/${ANDROID_ABI}/lib/libavcodec-57.so)
add_library(avfilter-6 SHARED IMPORTED)
set_target_properties(avfilter-6
PROPERTIES IMPORTED_LOCATION
${FFMPEG_DIR}/${ANDROID_ABI}/lib/libavfilter-6.so)
add_library(swresample-2 SHARED IMPORTED)
set_target_properties(swresample-2
PROPERTIES IMPORTED_LOCATION
${FFMPEG_DIR}/${ANDROID_ABI}/lib/libswresample-2.so)
add_library(swscale-4 SHARED IMPORTED)
set_target_properties(swscale-4
PROPERTIES IMPORTED_LOCATION
${FFMPEG_DIR}/${ANDROID_ABI}/lib/libswscale-4.so)
set(FFMPEG_LIBS
avutil-55
avformat-57
avcodec-57
avfilter-6
swresample-2
swscale-4)
include_directories(${FFMPEG_DIR}/${ANDROID_ABI}/include)
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon -g -O0")
add_library( # Sets the name of the library.
FFmpegWrapper
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/FFmpegWrapper.c
)
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.
FFmpegWrapper
# Links the target library to the log library
# included in the NDK.
${log-lib}
# ffmpeg library
${FFMPEG_LIBS}
)
【问题讨论】:
标签: android-ndk android-gradle-plugin