ABI Set Not Compatible

If you see the following error when initializing PSPDFKit, there may be multiple reasons. We’ll cover the two most frequent ones below:

Copy
1
2
3
4
5
6
7
8
05-17 15:07:32.827 E/PSPDFKit: The device's ABI set is not compatible with PSPDFKit: [some ABIs]
05-17 15:07:32.827 W/System.err: com.pspdfkit.exceptions.PSPDFInitializationFailedException: Failed to initialize PSPDFKit.
05-17 15:07:32.827 W/System.err: at com.pspdfkit.PSPDFKit.initialize(SourceFile:109)
...
05-17 15:07:32.837 W/System.err: at java.lang.reflect.Method.invoke(Method.java:525)
05-17 15:07:32.837 W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:744)
05-17 15:07:32.837 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-17 15:07:32.837 W/System.err: at dalvik.system.NativeStart.main(Native Method)

Device May Be Incompatible

The device you’re running PSPDFKit on is binary incompatible. Consult the list of CPU architectures supported by PSPDFKit.

ABI Conflict with Another Native Library

The error can appear if your app contains another library with native binaries that conflict with PSPDFKit. This can happen when using PSPDFKit with another library that either contains armeabi or mips binaries.

Here’s why this conflict happens: When installing an APK file that contains native libraries for multiple CPU architectures onto a device, the Android OS will select the correct libraries at install time. If you bundle native libraries for various ABIs, the OS will only select the single device ABI and copy it to the <myapp>/libs/ directory on the user’s device. If one device is missing binaries for the selected ABI, your app will likely generate an error (like the one above).

To fix the issue, you can enable ABI filtering in your build.gradle to remove all non-supported ABI sets. Just explicitly define the set of ABIs you would like to include in your final APK.

The following snippet will keep all binaries supported by PSPDFKit:

Copy
build.gradle
1
2
3
4
5
6
7
8
android {
    defaultConfig {
        ndk {
            // This will strip all non-supported ABI sets from the final APK file.
            abiFilters 'x86', 'arm64-v8a', 'armeabi-v7a'
        }
    }
}