lucky1928
lucky1928

Reputation: 8905

android - ndk not copy prebuild library to my apk

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:

  1. The build output apk lib directory only contains arm64 version, but I have defined armeabi,armeabi-v7a and arm64 in build.gradle. not sure why it doesn't take effect.

lib/ └── arm64-v8a └── libFFmpegWrapper.so

  1. The prebuild libraries not been included in apk lib directory at all, but I have the jniLibs line in my build.gradle, I checked hell-libs, it looks like the same.

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

Answers (1)

user6018651
user6018651

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

Related Questions