android - ndk没有将prebuild库复制到我的apk

时间:2017-12-07 04:40:10

标签: android-ndk android-gradle

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

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

两个问题:

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

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

      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
      

      的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}
                             )
      

1 个答案:

答案 0 :(得分:4)

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

src/main/cpp/
└── ffmpeg
    ├── include
    └── lib
        ├── arm64-v8a
        ├── armeabi
        └── armeabi-v7a

将其他代码行更改为正确的位置。 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})

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 {
   ...
}