2016-05-13 1 views
5

私はAPKをビルドして実行するためのGradleを使用する場合、私は下に::::libgnustl_shared.soファイルをサードパーティのsdksで複製する方法を修正しますか?

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 
+0

私のモジュールの1つは同じlibgnustl_shared.soファイル、私は私のプロジェクトにReactAndroidを追加するとき、私はこのエラーヒントを取得してい... –

+0

をここで見つけることができるきれいな、非ハックソリューションです。 https://stackoverflow.com/a/35660513/2850807 – UrbanMetro

答えて

2

のエラーを取得最後に、私は資産にファイル、および

を使用する前に手動でロードのいずれかを移動します
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のバグは修正されましたが、これはあまりうまくいきません。 誰かがもっと良い方法を得るなら、私に教えてください。 ありがとう!^ _^

+0

.soファイルの1つを再パッケージする必要がなく、これよりも優れた方法を見つけましたか? – matt

+1

これについて詳しく説明できますか?私はあなたが「そのファイルの一つを資産に移す」という意味を理解していません。 –

2

私はbuild.gradleに以下のコードを追加してこれを解決できました。それは一種のハックです。 React Nativeバージョンを含める必要がないなど、よりエレガントな修正が必要です。理想的にはReact Nativeがこれを解決します。 https://github.com/facebook/react-native/issues/9454

import com.android.build.gradle.internal.pipeline.TransformTask 

def deleteDuplicateJniFiles() { 
    def files = fileTree("${buildDir}/intermediates/exploded-aar/com.facebook.react/react-native/0.31.0/jni/") { 
     include "**/libgnustl_shared.so" 
    } 
    files.each { it.delete() } 
} 

tasks.withType(TransformTask) { pkgTask -> 
    pkgTask.doFirst { deleteDuplicateJniFiles() } 
} 
+0

これはlibgnustl_shared.soを削除するいい方法ではないと思います。 –

+1

私のプロジェクトでは、flatDir {dirs 'libs'}をマスターのgradleファイルに追加することも重要でした。 〜に。) –

1

クリーナーソリューションは、明示的問題について知っていることの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' 
    } 
} 
関連する問題