Reputation: 8905
I can build hello-libs google example code and the prebuild library has been copied to target apk correctly.
But in my app, compile has passed but apk DO not include the prebuild libraries.
Two issues:
lib/
└── arm64-v8a
└── libFFmpegWrapper.so
Detail information as below:
Android studio version: 3.0.1 OS: macosx 10.13.1
My file directory structure as below:
├── 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}
)
Upvotes: 4
Views: 1714
Reputation:
The share library directory structure should be changed as below:
src/main/cpp/
└── ffmpeg
├── include
└── lib
├── arm64-v8a
├── armeabi
└── armeabi-v7a
And change the other code line to right location. The CMakeList.txt maybe looks like below:
cmake_minimum_required(VERSION 3.4.1)
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/src/main/cpp/ffmpeg)
# library directory structure
# src/main/cpp/
# └── ffmpeg
# ├── include
# └── lib
# ├── arm64-v8a
# ├── armeabi
# └── armeabi-v7a
include_directories(${FFMPEG_DIR}/include)
set(FFMPEG_LIBS
avutil-55
avformat-57
avcodec-57
avfilter-6
swresample-2
swscale-4)
foreach(libname ${FFMPEG_LIBS})
message(add lib ${libname})
add_library(${libname} SHARED IMPORTED)
set_target_properties(${libname} PROPERTIES IMPORTED_LOCATION
${FFMPEG_DIR}/lib/${ANDROID_ABI}/lib${libname}.so)
endforeach()
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon -g -O0")
add_library(FFmpegWrapper SHARED src/main/cpp/FFmpegWrapper.c)
find_library(log-lib log)
target_link_libraries(FFmpegWrapper ${log-lib} ${FFMPEG_LIBS})
The build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
...
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}
...
}
...
sourceSets {
main {
// let gradle pack the shared library into apk
jniLibs.srcDirs = ['src/main/cpp/ffmpeg/lib']
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
...
}
Upvotes: 5