例外: java.lang.UnsatisfiedLinkError: dlopen に失敗しました: ライブラリ「libnative-imagetranscoder.so」

Facebook の fresco の最新バージョン 3.0.0 を使用する過程で、非常に残念なバグを発見しました。jpeg 画像をロードすると、画像が見つからないことを示すクラッシュ メッセージが報告されました。

致命的な例外: java.lang.UnsatisfiedLinkError: dlopen に失敗しました: ライブラリ "libnative-imagetranscoder.so" が
       java.lang.Runtime.loadLibrary0(Runtime.java:1082) に見つかりません
       (java.lang.Runtime.loadLibrary0(Runtime.java: 1003)
       java.lang.System.loadLibrary(System.java:1661)
       com.facebook.soloader.nativeloader.SystemDelegate.loadLibrary(SystemDelegate.java:24)
       com.facebook.soloader.nativeloader.NativeLoader.loadLibrary(NativeLoader) .java:52)
       com.facebook.soloader.nativeloader.NativeLoader.loadLibrary(NativeLoader.java:30)
       com.facebook.imagepipeline.nativecode.NativeJpegTranscoderSoLoader.ensure(NativeJpegTranscoderSoLoader.java:33) で
       com.facebook.imagepipeline.nativecode.NativeJpegTranscoder.<init>(NativeJpegTranscoder.java:59)
       com.facebook.imagepipeline.nativecode.NativeJpegTranscoderFactory.createImageTranscoder(NativeJpegTranscoderFactory.java:43)
       com.facebook.imagepipeline.transcoder.MultiImageTranscoderFactoryで.getNativeImageTranscoder(MultiImageTranscoderFactory.kt:59)
       at com.facebook.imagepipeline.transcoder.MultiImageTranscoderFactory.createImageTranscoder(MultiImageTranscoderFactory.kt:40)
       at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:166)
       com.facebook.imagepipeline.Producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:84)
       で com.facebook.imagepipeline.Producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
       で com.facebook.imagepipeline.Producers.AddImageTransformMetaDataProducer $AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:49)
       com.facebook.imagepipeline.Producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:33)
       com.facebook.imagepipeline.Producers.BaseConsumer.onNewResult(BaseConsumer.java:89) )
       com.facebook.imagepipeline.Producers.MultiplexProducer$Multiplexer.onNextResult(MultiplexProducer.java:510)
       で com.facebook.imagepipeline.Producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:569) で
       com.facebook.imagepipeline .Producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:562)
       com.facebook.imagepipeline.Producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
       com.facebook.imagepipeline.Producers.EncodedMemoryCacheProducer$EncodedMemoryCacheConsumer.onNewResultImpl (EncodedMemoryCacheProducer.java:181)
       com.facebook.imagepipeline.Producers.EncodedMemoryCacheProducer$EncodedMemoryCacheConsumer.onNewResultImpl(EncodedMemoryCacheProducer.java:123)
       com.facebook.imagepipeline.Producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
       com.facebook.imagepipeline.Producers.DiskCacheReadProducerで$1.then(DiskCacheReadProducer.java:113)
       com.facebook.imagepipeline.Producers.DiskCacheReadProducer$1.then(DiskCacheReadProducer.java:93)
       ボルトs.Task$14.run(Task.java:872)
       ボルトズ.BoltsExecutors$ImmediateExecutor .execute(BoltsExecutors.java:105)
       でボルト.Task.completeImmediately(Task.java:863)
       でボルト.Task.access$000(Task.java:32)
       でボルト.Task$10.then(Task.java:654)
       ボルト.Task$10.then(Task.java:651)
       ボルト.Task.runContinuations(Task.java:956)
       ボルト.Task.trySetResult(Task.java:994)
       ボルト.TaskCompletionSource.trySetResult(TaskCompletionSource.java) :39)
       でボルト.TaskCompletionSource.setResult(TaskCompletionSource.java:62)
       でボルト.Task$4.run(Task.java:357)
       で java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
       で java。 util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
       com.facebook.imagepipeline.core.PriorityThreadFactory.newThread$lambda$0(PriorityThreadFactory.kt:37)
       com.facebook.imagepipeline.core.PriorityThreadFactory.$r8$lambda$IPp7Vm9a1KDy8D4770JTjI9qOG4()
       で com.facebook.imagepipeline.core.PriorityThreadFactory$$ExternalSyntheticLambda0.run(:4)
       で java.lang.Thread.run(Thread.java) :1012)

 さまざまな分析の結果、次のことが判明しました。 ただし、「nativeimagetranscoder-2.6.0」はほぼ 700kb です。ファイルを解凍すると、libnative-imagetranscoder.so
https://repo1.maven.org/maven2/com/facebook/fresco/nativeimagetranscoder/2.6.0/nativeimagetranscoder-2.6.0.aarが見つかります。

Maven でファイルを表示できます。「nativeimagetranscoder-3.0.0」はわずか7kbです。
https://repo1.maven.org/maven2/com/facebook/fresco/nativeimagetranscoder/3.0.0/nativeimagetranscoder-3.0.0.aar

 これは、バージョン 3.0.0 でパッケージ化して公開するときにリソースをパッケージ化し忘れたことが原因であることを示しており、大手 Facebook 企業のスタッフもこの種の低レベルのミスを犯していました。

原因が判明したので、解決策を見てみましょう。

解決策 1: fresco バージョンをバージョン 2.6.0 にダウングレードします。バージョン 2.6.0 は正常に動作します。

 解決策 2: バージョン 3.0.0 では libnative-imagetranscoder.so ライブラリが見つからず、バージョン 2.6.0 が使用できるため、2.6.0 に libnative-imagetranscoder.so を導入します。

implementation('com.facebook.fresco:nativeimagetranscoder') {
        version {
            strictly '2.6.0'
        }
}

 解決策 3: 2.6.0 の「libnative imagetranscoder.so」ファイルをプロジェクトの jniLibs ディレクトリにコピーして使用します。

 結論: 私たちは、公式がこの深刻な問題を時間内に修正することを期待しています。残念なことに、フレスコ画ライブラリは長い間更新されていません。


 

おすすめ

転載: blog.csdn.net/Jason_HD/article/details/132998509