Немного поздно, но кому-то еще может быть интересно (или даже оп).
У меня была та же ситуация, что и в операторе, и я пробовал много разных вещей. Одним из них было попытаться скомпилировать проект с более ранней версией NDK (я думаю, что r14b, но я не совсем уверен). Я получил другую ошибку и сумел отследить проблему, которая хорошо описана здесь , в разделах «Недопустимые записи DT_NEEDED» и «Отсутствует SONAME». Кроме того, проблема описана в этом конкретном вопросе и получила адекватный ответ.
Если вы не можете перекомпилировать разделяемую библиотеку, которую используете, чтобы включить SONAME, как в моем случае, вы можете сделать следующее, что я сделал и смог работать:
- Включите библиотеку в папку jniLibs в дереве проекта, чтобы она была упакована в ваш APK, но не связывайтесь с ней.
- Отслеживайте символы функций, которые вы хотите включить, используя любой метод, описанный здесь .
- Создание указателей функций соответствующих функций в вашем коде C ++.
- Загрузка общей библиотеки во время выполнения и сопоставление с этими функциями.
Пример кода
Заголовок
private:
typedef uint32_t (*InitX_t)();
typedef uint32_t (*DoX_t)();
typedef uint32_t (*GetX)(uint32_t, char*);
InitX_t InitX;
DoX_t DoX;
GetX_t GetX;
CPP
void *handle = dlopen("libMyLib.so", RTLD_NOW);
if(handle == nullptr)
{
__android_log_print(ANDROID_LOG_INFO, "My Class", "Could not load library");
}
else
{
__android_log_print(ANDROID_LOG_INFO, "My Class", "Library loaded");
}
InitX = (InitX_t)dlsym(handle, "InitX_SYMBOL");
ScanX = (ScanX_t)dlsym(handle, "ScanX_SYMBOL");
GetX = (GetX_t)dlsym(handle, "GetX_SYMBOL");
if(ScanX == nullptr || GetX == nullptr || InitX == nullptr)
{
__android_log_print(ANDROID_LOG_INFO, "My Class", "Could not load functions.");
}
Если все сделано правильно, теперь вы сможете использовать функции как обычно. Однако я понимаю, что это не самый простой процесс, если вы новичок.