Возможность сборки NDK с помощью CMAKE: динамическая библиотека не обнаружена, ошибка - PullRequest
0 голосов
/ 15 декабря 2018

То, что я хочу, это создать собственный двоичный файл с NDK.Есть пары разделяемых библиотек, также была построена.Структура APK выглядит следующим образом:

/data/data/mypackage/files/my_binary
/data/data/mypackage/lib/liba.so
/data/data/mypackage/lib/libb.so

Когда исполняется бинарный файл, выдается ошибка типа CANNOT LINK EXECUTABLE: could not load library "liba.so" needed by "./mybinay"; caused by library liba.so not found.Работает нормально после установки LD_LIBRARY_PATH на /data/data/mypackage/lib.

У меня вопрос, как заставить его работать без установки LD_LIBRARY_PATH в файле CMAKE или Gradel?

Файл Cmake.

add_library(a, src/a.cc)
add_library(b, src/b.cc)
add_executable(mybinary src/mybinary.cc)
target_link_libraries(a log)
target_link_libraries(mybinary a android log b)

Файл Gradle.

externalNativeBuild {
    cmake {
        cppFlags "-std=c++14 -frtti -fexceptions"
        targets 'mybinary','a','b'
    }
}

1 Ответ

0 голосов
/ 15 декабря 2018

Сценарий выполнения не связан с CMake или gradle.Вам не нужно LD_LIBRARY_PATH до build исполняемого файла.

Я предпочитаю упаковывать исполняемый файл в libs/ APK, рядом с liba.so и libb.so .Хитрость заключается в том, чтобы переименовать my_binary во что-то Ike libmy_binary.so (см. https://stackoverflow.com/a/15099666/192373).

Итак, это будет означать, что теперь CMakeLists.txt может выглядеть следующим образом:

add_library(a, src/a.cc)
add_library(b, src/b.cc)
add_executable(mybinary src/mybinary.cc)
target_link_libraries(a log)
target_link_libraries(lib.mybinary.so a android log b)

И установка LD_LIBRARY_PATH тривиальна:

try {
    Runtime.getRuntime().exec(
        getApplicationInfo().nativeLibraryDir + "/lib.mybinary.so", 
        new String[]{"LD_LIBRARY_PATH="+ getApplicationInfo().nativeLibraryDir});
} catch (IOException e) {
    e.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...