如何修复在第三方sdks中复制的libgnustl_shared.so文件?

时间:2016-05-13 03:41:51

标签: android java-native-interface duplicates android-gradle android-library

当我使用gradle构建并运行apk时,我得到以下错误::::

Error:Execution failed for task ':app:transformNative_libsWithMergeJniLibsForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK lib/armeabi-v7a/libgnustl_shared.so
    File1:  
app/build/intermediates/exploded-aar/com.facebook.react/react-native/0.20.1/jni
    File2:  
app/build/intermediates/exploded-aar/app/videosdk/unspecified/jni

3 个答案:

答案 0 :(得分:6)

清洁解决方案是明确告诉Gradle您知道该问题并接受任何这些文件。根据您支持的体系结构,您可能只需要一些。您可以找到详细信息in documentation

android {

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

答案 1 :(得分:4)

我可以通过将以下代码添加到 ActionBar actionBar = getSupportActionBar(); actionBar.setCustomView(R.layout.togle); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM); 来解决此问题。这是一种黑客行为;应该有一个更优雅的修复,就像不必包含React Native版本一样。理想情况下,React Native会解决这个问题。我提出了一个问题:https://github.com/facebook/react-native/issues/9454

build.gradle

答案 2 :(得分:3)

最后,我将其中一个so文件移动到资源,并在使用之前手动加载

 String path = getApplication().getFilesDir().toString() + "/armeabi-v7a/libgnustl_shared.so";
 if (!FileUtils.isFileExit(path))  //move so from assets to another dir
       FileUtils.initSOFileFromAssetsFile(getApplication()); 
 System.load(path);

虽然它修复了DuplicateFileException错误,但效果不是很好。 如果有人得到更好的方式请告诉我。 谢谢!^ _ ^