'More than one file was found with OS independent path 'lib/x86/libusb.so'

I am using libusb in my android application. When I am trying to build libusb native library then I get below error message, *.so files generated.

Error:Execution failed for task ':app:transformNativeLibsWithMergeJniLibsForDebug'. More than one file was found with OS independent path 'lib/x86/libusb.so'

enter image description here

build.gradle

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "com.williams.libusbpoc"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }

    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }

    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main').absolutePath
        }
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestImplementation ('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.0.0-beta2'
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    compile "org.jetbrains.anko:anko-appcompat-v7-commons:$anko_version"
}

I am on windows machine. Does anyone know what could be the issue ?



Solution 1:[1]

I removed jniLibs.srcDir 'src/main/libs' code inside sourceSets.main block. It was creating *.so files twice.

sourceSets.main {
    jniLibs.srcDir 'src/main/libs'
    jni.srcDirs = [] //disable automatic ndk-build call
}

Solution 2:[2]

I was having this issue in my React-Native Bridge project after I added AAR files of 3rd party SDK. And I was linking the Bridge into my Main React-native application.

Solution (May differ for you):

Add this in app/build.gradle the Main React-Native application:

android {
    // ...
    packagingOptions {
        pickFirst '**/*.so'
    }
}
  • Test the Build on React-Native Bridge project after adding the AAR libraries.
  • Clean the React-Native Bridge project
  • Clean the React-Native application project
  • Remove node_modules and re-install the bridge package into the project.
  • Run the application.

I faced another issue related to this (If you include AAR into library project that's not being linked to main application)

https://stackoverflow.com/a/58588503/3197778

Solution 3:[3]

you can use like this:

add the following code into build.gradle ,

packagingOptions {
    pickFirst 'lib/armeabi-v7a/your_name.so'
    pickFirst 'lib/arm64-v8a/your_name.so'
    pickFirst 'lib/x86/your_name.so'
    pickFirst 'lib/x86_64/your_name.so'
}

this pickFirst that means : if more than one path matches the first-pick, only the first found will be selected. please click Get more information

Solution 4:[4]

In case of react-native add android/app/build.gradle file into andorid : {.....} section this :

packagingOptions {
    pickFirst 'lib/x86/libc++_shared.so'
    pickFirst 'lib/x86_64/libjsc.so'
    pickFirst 'lib/arm64-v8a/libjsc.so'
    pickFirst 'lib/arm64-v8a/libc++_shared.so'
    pickFirst 'lib/x86_64/libc++_shared.so'
    pickFirst 'lib/armeabi-v7a/libc++_shared.so'
}

then use "gradlew clean"

Solution 5:[5]

I've seen a similar error running my app after migration to Android Studio 3.0. A build clean solved the issue.

Solution 6:[6]

in my case adding these fixed the issue to build.gradle app level module

packagingOptions {
    pickFirst 'lib/armeabi-v7a/libblasV8.so'
    pickFirst 'lib/mips/librsjni.so'
    pickFirst 'lib/x86/libblasV8.so'
    pickFirst 'lib/mips/libRSSupport.so'
    pickFirst 'lib/mips/libblasV8.so'
}

but in your case library names could be different so replace them with your library names

Solution 7:[7]

Manually clean the project. Perform the following in the project directory:

rm -rf .idea .gradle */build */.cxx
rm -rf ~/.gradle

This will clean up all intermediate files and also clear the gradle cache.

Solution 8:[8]

I just want to add to Nonos answer that I think I received this issue after running ndk-build within my app/jni directory, and then running ./gradlew installDebug from the top-level directory of my Android NDK project. So doing an ndk-build clean in app/jni before doing another Gradle build did indeed solve the problem.

Solution 9:[9]

N Sharma solutions is good.

But in case your conflict is with an external module that you added as a library in your project and you are not able to edit its code as it is readonly you can follow below steps:

I was facing same issue with ffmpeg library after merging two Android projects as one project.

Actually issue was arriving due to two different versions of ffmpeg library but they were loaded with same names in memory. One library was placed in JNiLibs while other was inside another library used as module. I was not able to modify the code of module as it was readonly so I renamed the one used in my own code to ffmpegCamera and loaded it in memory with same name.

System.loadLibrary("ffmpegCamera");

This resolved the issue and now both versions of libraries are loading well as separate name and process id in memory.

Solution 10:[10]

I was seeing this error after adding react-native-pdf to my project. FAHID's solution worked for me.

Note that in later versions of Gradle, pickFirst() is deprecated in favor of resources.pickFirsts() or jniLibs.pickFirsts.add().

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 N Sharma
Solution 2 User Rebo
Solution 3 Manna Yang
Solution 4 Vivek Jm
Solution 5
Solution 6 Zeeshan Mehdi
Solution 7 Meixner
Solution 8 BlazePascal
Solution 9 Mohsin Raza
Solution 10 bartonstanley