Android-NDK不将预构建库复制到我的APK

luc*_*928 3 android-ndk android-gradle-plugin

我可以构建hello-libs谷歌示例代码,并且预构建库已正确复制到目标apk。

但是在我的应用程序中,编译已通过,但apk不包括预构建库。

两个问题:

  1. 构建输出apk lib目录仅包含arm64版本,但是我在build.gradle中定义了armeabi,armeabi-v7a和arm64。不知道为什么它没有生效。

lib/ ??? arm64-v8a ??? libFFmpegWrapper.so

  1. prebuild库根本没有包含在apk lib目录中,但是我的build.gradle中有jniLibs行,我检查了hell-libs,它看起来一样。

详细信息如下:

Android Studio版本: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
Run Code Online (Sandbox Code Playgroud)

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'
}
Run Code Online (Sandbox Code Playgroud)

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}
                       )
Run Code Online (Sandbox Code Playgroud)

bee*_*lej 5

共享库目录结构应作如下更改:

src/main/cpp/
??? ffmpeg
    ??? include
    ??? lib
        ??? arm64-v8a
        ??? armeabi
        ??? armeabi-v7a
Run Code Online (Sandbox Code Playgroud)

并将其他代码行更改为正确的位置。CMakeList.txt可能如下所示:

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})
Run Code Online (Sandbox Code Playgroud)

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 {
   ...
}
Run Code Online (Sandbox Code Playgroud)