Reputation: 34507
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'
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
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
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.
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
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'
}
}
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
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
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
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
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
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
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
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
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
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