【问题标题】:android - ndk not copy prebuild library to my apkandroid - ndk 不会将预构建库复制到我的 apk
【发布时间】:2023-03-05 05:11:01
【问题描述】:

我可以构建 hello-libs google 示例代码,并且预构建库已正确复制到目标 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 工作室版本: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2017-04-06
      • 2018-05-30
      • 2017-02-05
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多