Java.lang.UnsatisfiedLinkError при использовании с android 5.0

Я создаю приложение для Android. Кодирование и декодирование с использованием кодека Opus. Я использую собственный код здесь http://www.opus-codec.org/ и обертку отсюда https://github.com/jitsi/libjitsi/tree/master/src/native/opus . В Android 4.0+ я создал файл .so и запускался, все в порядке. Но в Android 5.0, он разбивается, когда я вызываю собственный метод. Вот деталь аварии:

java.lang.UnsatisfiedLinkError: No implementation found for long my.package.name.codec.Opus.encoder_create(int, int) (tried Java_my_package_name_codec_Opus_encoder_1create and Java_my_package_name_codec_Opus_encoder_1create__II) 

Я также много ищу, но не могу найти основную причину, и у меня с ней одна и та же проблема. Ниже мой файл mk, я считаю это полезным.

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) MY_MODULE_DIR := opus LOCAL_MODULE := $(MY_MODULE_DIR) LOCAL_SRC_FILES := $(wildcard ( libopus/src/*.c \ libopus/celt/*.c \ libopus/celt/arm/*.c \ libopus/silk/*.c \ libopus/silk/arm/*.c \ libopus/include/*.c \ libopus/silk/fixed/*.c \ my_package_name_codec_Opus.c )) LOCAL_C_INCLUDES := \ libopus/src \ libopus/include \ libopus/silk \ libopus/silk/fixed \ libopus/silk/arm \ libopus/celt \ libopus/celt/arm \ libopus \ LOCAL_CFLAGS := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno LOCAL_CPPFLAGS := -DBSD=1 LOCAL_CPPFLAGS += -ffast-math -O3 -funroll-loops include $(BUILD_SHARED_LIBRARY) 

PS: если вам нужно больше файлов, пожалуйста, дайте мне знать.

Проведя смешное количество времени, отлаживая ту же самую проблему, включив checkjni, запустив javah, чтобы убедиться, что мои заголовки соответствуют моему java-коду, компилируя с PIE – я в конце концов нашел проблему.

Android 5.0 добавила поддержку opus. Это означает, что система уже поставляется с файлом libopus.so. Когда вы запускаете loadlibrary – это не ваша загруженная версия, а libpus.so, которая была в комплекте с Android.

Просто измените имя своей библиотеки на libmyopus.so, и это должно решить вашу проблему. MY_MODULE_DIR: = myopus и, конечно же, обновляют ваш вызов System.loadlibrary.