Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library “libnative-imagetranscoder.so

In the process of using the latest version 3.0.0 of Facebook's fresco, I discovered a very pitiful bug. When loading a jpeg image, a crash message indicating that the so was not found was reported:

Fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library "libnative-imagetranscoder.so" not found
       at java.lang.Runtime.loadLibrary0(Runtime.java:1082)
       at java.lang.Runtime.loadLibrary0(Runtime.java:1003)
       at java.lang.System.loadLibrary(System.java:1661)
       at com.facebook.soloader.nativeloader.SystemDelegate.loadLibrary(SystemDelegate.java:24)
       at com.facebook.soloader.nativeloader.NativeLoader.loadLibrary(NativeLoader.java:52)
       at com.facebook.soloader.nativeloader.NativeLoader.loadLibrary(NativeLoader.java:30)
       at com.facebook.imagepipeline.nativecode.NativeJpegTranscoderSoLoader.ensure(NativeJpegTranscoderSoLoader.java:33)
       at com.facebook.imagepipeline.nativecode.NativeJpegTranscoder.<init>(NativeJpegTranscoder.java:59)
       at com.facebook.imagepipeline.nativecode.NativeJpegTranscoderFactory.createImageTranscoder(NativeJpegTranscoderFactory.java:43)
       at 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)
       at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:84)
       at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
       at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:49)
       at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:33)
       at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
       at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.onNextResult(MultiplexProducer.java:510)
       at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:569)
       at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:562)
       at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
       at com.facebook.imagepipeline.producers.EncodedMemoryCacheProducer$EncodedMemoryCacheConsumer.onNewResultImpl(EncodedMemoryCacheProducer.java:181)
       at com.facebook.imagepipeline.producers.EncodedMemoryCacheProducer$EncodedMemoryCacheConsumer.onNewResultImpl(EncodedMemoryCacheProducer.java:123)
       at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
       at com.facebook.imagepipeline.producers.DiskCacheReadProducer$1.then(DiskCacheReadProducer.java:113)
       at com.facebook.imagepipeline.producers.DiskCacheReadProducer$1.then(DiskCacheReadProducer.java:93)
       at bolts.Task$14.run(Task.java:872)
       at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:105)
       at bolts.Task.completeImmediately(Task.java:863)
       at bolts.Task.access$000(Task.java:32)
       at bolts.Task$10.then(Task.java:654)
       at bolts.Task$10.then(Task.java:651)
       at bolts.Task.runContinuations(Task.java:956)
       at bolts.Task.trySetResult(Task.java:994)
       at bolts.TaskCompletionSource.trySetResult(TaskCompletionSource.java:39)
       at bolts.TaskCompletionSource.setResult(TaskCompletionSource.java:62)
       at bolts.Task$4.run(Task.java:357)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
       at com.facebook.imagepipeline.core.PriorityThreadFactory.newThread$lambda$0(PriorityThreadFactory.kt:37)
       at com.facebook.imagepipeline.core.PriorityThreadFactory.$r8$lambda$IPp7Vm9a1KDy8D4770JTjI9qOG4()
       at com.facebook.imagepipeline.core.PriorityThreadFactory$$ExternalSyntheticLambda0.run(:4)
       at java.lang.Thread.run(Thread.java:1012)

 After various analyses, it was found: But "nativeimagetranscoder-2.6.0" is almost 700kb. Unzip the file and we can find libnative-imagetranscoder.so
https://repo1.maven.org/maven2/com/facebook/fresco/nativeimagetranscoder/2.6.0/nativeimagetranscoder-2.6.0.aar

We can view the file in maven. "nativeimagetranscoder-3.0.0" is only 7kb.
https://repo1.maven.org/maven2/com/facebook/fresco/nativeimagetranscoder/3.0.0/nativeimagetranscoder-3.0.0.aar

 This shows that it was caused by forgetting to package resources when packaging and publishing in version 3.0.0. Staff from major Facebook companies also made this kind of low-level mistake.

The reason has been found, let’s take a look at the solution:

Solution 1: Downgrade the fresco version to version 2.6.0, which can work normally

 Solution 2: Since version 3.0.0 cannot find the libnative-imagetranscoder.so library and version 2.6.0 can be used, then introduce libnative-imagetranscoder.so in 2.6.0:

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

 Solution 3: Copy the "libnative imagetranscoder.so" file under 2.6.0 to the project jniLibs directory for use

 Conclusion: We still look forward to the official fixing this serious problem in time. Sadly, the fresco library has not been updated for a long time.


 

Guess you like

Origin blog.csdn.net/Jason_HD/article/details/132998509