Ваша проблема не с кодом библиотеки, а с самими файлами .so.
Устройства Android имеют основной ABI, набор инструкций, поддерживаемый процессором.
Например, некоторые устройства с 64-разрядными процессорами используют ABI arm64-v8a
.
Однако многие библиотеки и приложения еще не поддерживают 64-битные процессоры. Поэтому обычно новые процессоры также поддерживают вторичный ABI, который является более распространенным. Например, arm64-v8a
процессоры обычно также поддерживают armeabi-v7a
.
Когда приложение запускается, оно начинает искать собственные библиотеки в каталогах. Сначала он проверяет основной каталог ABI, arm64-v8a
в этом примере. Если .so-файлов нет, он проверяет вторичный каталог ABI (armeabi-v7a
). Если все еще не найден, вы получите ошибку, которую вы описали.
В вашем случае, как вы сказали, у вас есть файлы, так что это не проблема.
Одна большая проблема с этим выбором состоит в том, что он всегда придерживается основного ABI, если каталог существует. Это может привести к сбоям, если не все библиотеки предоставляют все файлы .so для всех ABI. Это описано здесь .
Вот пример: вы включаете в свое приложение 2 библиотеки:
1. VideoPlayerLibrary, которая имеет .so файлы для всех ABI
2. GifLibrary, которая имеет файлы .so только для armeabi
и armeabi-v7a
.
Теперь, если вы запустите приложение на устройстве arm64-v8a
, оно будет придерживаться своего основного ABI, потому что оно нашло там файлы (.so файлы VideoPlayerLibrary). Но в тот момент, когда вы захотите воспроизвести GIF-файл, он попытается загрузить файлы .so из каталога arm64-v8a
, но не найдет их там и вылетит, как в вашем сообщении с ошибкой ссылки.
Так что вы можете сделать?
У вас есть 2 варианта:
- Если ваша собственная библиотека содержит недостающие файлы .so, скомпилируйте ее для всех ABI.
Если это не ваша собственная, проверьте, есть ли более новая версия, которая исправила эту проблему.
- Исключить неполные ABI из приложения. Таким образом, новые процессоры будут использовать вторичный ABI для запуска приложения. Это, конечно, приведет к ухудшению производительности, но не приведет к сбою.
По моему опыту, наиболее важным ABI является
armeabi-v7a
, это должно поддерживаться, вероятно, всеми устройствами Android.