В настоящее время я работаю на андроид приложение, которое потоки радио. Я использую встроенную библиотеку декодера, которая называется aacdecoder. Все было нормально, пока приложение не получило ошибку при сбое на некоторых устройствах Android. Это было очень неприятно. Потому что приложение прекрасно воспроизводит радиопотоки практически на всех устройствах, кроме Samsung S6 и S6 Edge. говорит
Краш сообщает, что
Fatal Exception: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.radyoland.android-1/base.apk”],nativeLibraryDirectories=[/data/app/com.radyoland.android-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn’t find “libaacdecoder.so”
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:988)
at com.spoledge.aacdecoder.Decoder.loadLibrary(Decoder.java:187)
Как вы видите, что аварии говорят, что он не может загрузить нативную библиотеку. Но почему? Прежде всего, я проверил свою структуру, если файлы исходной библиотеки .so установлены правильно.
Кажется, все было в порядке, кроме этой сумасшедшей ошибки. Затем, после некоторых исследований, я узнал, что некоторые устройства Android имеют 64-разрядные процессоры. Эти устройства генерируют и проверяют папку arm64 для загрузки собственной библиотеки. Это была проблема. Потому что у моего проекта нет папки arm64. Вот решение;
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
}
}
Вам нужно добавить эти фильтры (abiFilters) для build.gradle файлов своего приложения модуля.Поэтому, когда ваше устройство попытается запустить ваше приложение, оно проверит файл gradle и поймет, что он не должен генерировать какую-либо папку и использовать существующие ресурсы родной библиотеки. Boom. Почти решен. Но все же есть еще одна вещь.
android.useDeprecatedNdk=true
Добавьте эту строку в свой gradle.properties, чтобы использовать устаревший Ndk.
Наконец-то мое приложение работает на S6 и S6 Edge. Я имею в виду, что он работает на всех устройствах с новыми 64-разрядными процессорами. Это поздний ответ, но я надеюсь, что это поможет кому-то вроде меня.
Я загрузил этот пример http://www.swig.org/Doc2.0/Android.html#Android_examples_intro Мой CBU/ABI - armeabi-v7a Есть ли какое-нибудь решение? – developergg
Если вы новичок в jni, используйте пример google: https://code.google.com/p/awesomeguy/wiki/JNITutorial. Мне лично не нравится свинг, я не использую его. Swig добавит дополнительный уровень сложности в ваш код, и, поскольку вы не полностью понимаете концепцию jni, лучше сначала избегать его (swig генерирует для вас вещи ... вам нужно знать, что это за вещи и как они используются, прежде чем вы сможете в полной мере воспользоваться преимуществами того, что предлагает swig;)) – MichaelCMS
У меня нет выбора. Поскольку мой клиент предоставляет мне C++-функцию, которую я должен вызывать из своего java-кода. – developergg