1

My project has dependencies on ffmpeg. I will put some piece of my build.gradle file:

  apply plugin: 'com.android.model.application'

    model{
    // defining libavcodec library
    repositories {
        libs(PrebuiltLibraries) {
            avcodec {
                headers.srcDir "src/main/jni/include/ffmpeg"
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("src/main/jni/lib/android/libavcodec.a")
                }
            }
        }
    }

    // defining libavformat library
    repositories {
        libs(PrebuiltLibraries) {
            avformat {
                headers.srcDir "src/main/jni/include/ffmpeg"
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("src/main/jni/lib/android/libavformat.a")
                }
            }
        }
    }

    // defining libavutil library
    repositories {
        libs(PrebuiltLibraries) {
            avutil {
                headers.srcDir "src/main/jni/include/ffmpeg"
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("src/main/jni/lib/android/libavutil.a")
                }
            }
        }
    }

    // defining libx264 library
    repositories {
        libs(PrebuiltLibraries) {
            x264 {
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("src/main/jni/lib/android/libx264.a")
                }
            }
        }
    }

    // defining libssl library
    repositories {
        libs(PrebuiltLibraries) {
            ssl {
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("src/main/jni/lib/android/libssl.a")
                }
            }
        }
    }

    // defining libcrypto library
    repositories {
        libs(PrebuiltLibraries) {
            crypto {
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("src/main/jni/lib/android/libcrypto.a")
                }
            }
        }
    }

    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            applicationId = "pro.net.sa"
            minSdkVersion.apiLevel = 14
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"

        }
    }

    android.ndk {

        moduleName = "mymodule"

        toolchain = "clang"

        toolchainVersion = "3.8"

        cppFlags.add("-std=c++11")


        cppFlags.add("-fexceptions")
        cppFlags.add("-frtti")
        cppFlags.add("-Wno-deprecated-declarations")
        cppFlags.add("-Wno-deprecated-register")
        cppFlags.add("-D ASIO_STANDALONE")

        CFlags.add("-I" + file("src/main/jni/androidplayer").absolutePath)
        .........

        ldLibs.addAll(["log" , "android", "z","OpenMAXAL", "dl"])

        stl = "gnustl_shared"
        debuggable = true
        platformVersion = 14
    }

    android.lintOptions{
        ignoreWarnings = true
    }
    android.productFlavors {
         create("arm7") {
            ndk.abiFilters.add("armeabi-v7a")
        }           
    }

    android.sources{
        main{
            jni{
                dependencies{
                    library "avcodec" linkage "static"
                    library "avformat" linkage "static"
                    library "avutil" linkage "static"
                    library "x264" linkage "static"
                    library "ssl" linkage "static"
                    library "crypto" linkage "static"
                }
            }
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile files('src/main/libs/Logger.jar')
    compile files('src/main/libs/universal-image-loader-1.9.4.jar')
    compile files('src/main/libs/androidLogger.jar')
}

I'm continuosly getting below errors:

Error:error: undefined reference to 'avcodec_pix_fmt_to_codec_tag'
Error:error: undefined reference to 'avpriv_find_pix_fmt'
Error:error: undefined reference to 'ff_raw_pix_fmt_tags'
Error:error: linker command failed with exit code 1 (use -v to see invocation) 

I think everything I did is correct, but can not understand why that errors are occurring continuously. Is there anyone who could help? I'm using Android Studio 1.5.1, gradle 2.10, gradle-experimental 0.7.0-alpha5

Edit: I added next lines after cppFlags:

        ldFlags.add("${file("src/main/jni/lib/android/libavcodec.a")}".toString())
        ldFlags.add("${file("src/main/jni/lib/android/libavformat.a")}".toString())
        ldFlags.add("${file("src/main/jni/lib/android/libavutil.a")}".toString())
        ldFlags.add("${file("src/main/jni/lib/android/libx264.a")}".toString())
        ldFlags.add("${file("src/main/jni/lib/android/libssl.a")}".toString())
        ldFlags.add("${file("src/main/jni/lib/android/libcrypto.a")}".toString())

then I'm getting next errors:

/home/user/android-ndk-r11b/sources/cxx-stl/gnu-libstdc++/4.9/include/bits/atomic_base.h
Error:(411, 16) error: cannot compile this atomic library call yet
Error:(411, 16) error: cannot compile this atomic library call yet
Error:(411, 16) error: cannot compile this atomic library call yet
support_ms
  • 1,873
  • 1
  • 18
  • 33

1 Answers1

3

Shouldn't you use different static libraries for different abi's?

ldFlags.add("${file("src/main/jni/lib/android/$abi/libavcodec.a")}".toString())

instead of

ldFlags.add("${file("src/main/jni/lib/android/libavcodec.a")}".toString())

Here is example of how to do such a thing.

c4pQ
  • 884
  • 8
  • 28
  • 1
    As I know abi's are only for shared libs not static in android – support_ms Apr 06 '16 at 09:06
  • As I understand this, .a files consist of obj files. And if you look at sources of ffmpeg, you can see different source files for different architectures. And there's no point to prebuild, let's say x86 folder, for arm project. Also, if you look at crystax-ndk project, you can find different static libraries for different abi's. Moreover if you build openssl for arm and for x86 yourself, static libraries' sizes will differ. – c4pQ Apr 06 '16 at 09:13
  • Yes. You were right. Also I left only "arm7" and deleted other abi's as for all of them I had to provide correctly compiled static libs("x86","mips"...). In my case they were only for "armeabi-v7a" – support_ms Apr 06 '16 at 12:10
  • Your answer saved lots of time! Thanks mate! – Toochka May 27 '16 at 10:57
  • I remebered one interesting thing: better compile for `armeabi` ABI, because this library would work fine for both `armeabi-v7a` and `arm64-v8a` ABI's. It would be a bit slower (there would be no optimization), but if you need just a fast solution for all kind of arm-based phones, it should work. – c4pQ Jun 01 '16 at 11:54
  • Why is it necessary to specify abi's for static libraries, but not shared libraries? – IgorGanapolsky Jul 18 '16 at 13:22
  • 1
    Igor, please take a look at the second comment in this branch. – c4pQ Jul 19 '16 at 20:04