N Sharma
N Sharma

Reputation: 34507

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 ?

Upvotes: 46

Views: 84116

Answers (12)

Jay
Jay

Reputation: 919

If you are using react native version below 0.70.5 then you should implement this, Add this code in android/build.gradle file

repositories {
   exclusiveContent {
       // We get React Native's Android binaries exclusively through npm,
       // from a local Maven repo inside node_modules/react-native/.
       // (The use of exclusiveContent prevents looking elsewhere like Maven Central
       // and potentially getting a wrong version.)
       filter {
           includeGroup "com.facebook.react"
       }
       forRepository {
           maven {
               url "$rootDir/../node_modules/react-native/android"
           }
       }
    }
    // ...
  }
}

It worked for me.

If Your gradle version 6.1 or below, you must use a different workaround as gradle 6.1 does not support exclusiveContent. You can use this,

def REACT_NATIVE_VERSION = new File(['node', '--print',"JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim())

allprojects {
    configurations.all {
        resolutionStrategy {
            // Remove this override in 0.65+, as a proper fix is included in react-native itself.
            force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION
        }
    }

Upvotes: 2

abhish
abhish

Reputation: 439

faced this issue in react-native "react-native": "0.64.2"
facing this issue because of recent react native updates, old builds are failing

i have done the fallowing to run the build successfully & this solution works after most of the issue caused in recent update.

  1. in android/build.gradle (not the project level) change the followings
  • add kotlin version in ext of buildScripts {... kotlin_version = '1.6.10'}

  • in dependecies add the classpath
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    add this line in between ending of buildscript and beginning of allprojects

  • add this line in the first beginning of all projects

    configurations.all {
      resolutionStrategy {
          force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION
      }
    }
    

Upvotes: 0

FAHID
FAHID

Reputation: 3395

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

Upvotes: 112

bartonstanley
bartonstanley

Reputation: 1307

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().

Upvotes: 2

Meixner
Meixner

Reputation: 695

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.

Upvotes: 1

Vivek Jm
Vivek Jm

Reputation: 121

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"

Upvotes: 10

Mohsin Raza
Mohsin Raza

Reputation: 518

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.

Upvotes: 0

Zeeshan Mehdi
Zeeshan Mehdi

Reputation: 1439

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

Upvotes: 5

Manna Yang
Manna Yang

Reputation: 321

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

Upvotes: 22

zachaz35
zachaz35

Reputation: 47

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.

Upvotes: 0

Nonos
Nonos

Reputation: 2518

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

Upvotes: 5

N Sharma
N Sharma

Reputation: 34507

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
}

Upvotes: 29

Related Questions