首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有将预构建库复制到我的apk中。

没有将预构建库复制到我的apk中。
EN

Stack Overflow用户
提问于 2017-12-07 04:40:10
回答 1查看 1.4K关注 0票数 4

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

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

两个问题:

  1. 构建输出apk目录仅包含arm64版本,但我在build.gradle中定义了armeabi、armeabi-v7a和arm64。不知道为什么它不起作用。
代码语言:javascript
复制
 `lib/     └── arm64-v8a         └── libFFmpegWrapper.so` 
  1. 预构建库根本没有包含在apk目录中,但是我的jniLibs行在我的build.gradle中,我检查了地狱库,看起来是一样的。

详情如下:

安卓工作室版本: 3.0.1操作系统: macosx 10.13.1

我的文件目录结构如下:

代码语言:javascript
复制
├── 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

代码语言:javascript
复制
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

代码语言:javascript
复制
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}
                       )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-07 16:20:10

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

代码语言:javascript
复制
src/main/cpp/
└── ffmpeg
    ├── include
    └── lib
        ├── arm64-v8a
        ├── armeabi
        └── armeabi-v7a

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 {
   ...
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47687711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档