Android NDK - создание общей библиотеки из исходного кода - PullRequest
0 голосов
/ 29 октября 2018

Я работаю над приложением для Android, которое использует сторонние собственные библиотеки. Нам нужно добавить некоторые функции в эти библиотеки. Поэтому я написал набор классов C ++ с нужным мне кодом, а также кросс-компиляцию openssl, так как мы используем криптографические функции openssl.

Я сделал демонстрационное приложение для проверки своего кода, и все работает нормально.

Теперь мне нужно отправить этот код людям, которые разрабатывают сторонние библиотеки, и они добавят наш код и свернут весь нативный код в JAR-файл, чтобы мы могли использовать его в нашем приложении.

Я использовал этот пример NDK hello libs в качестве базы. Поскольку я хочу отправить свой код в виде разделяемой библиотеки (файл .so), я сделал это в CMakeList.txt:

cmake_minimum_required(VERSION 3.4.1)

set(distribution_DIR ${CMAKE_SOURCE_DIR}/../distribution)

add_library(lib_crypto STATIC IMPORTED)
set_target_properties(lib_crypto PROPERTIES IMPORTED_LOCATION
    ${distribution_DIR}/openssl/lib/${ANDROID_ABI}/libcrypto.a)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

### This code just calls my my-lib ###
add_library(native-lib SHARED
        src/main/cpp/native-lib.cpp)

### This is the lib I want to build ###
add_library(my-lib SHARED
         src/main/cpp/*****.cpp
         # more files...
         )

target_include_directories(my-lib PRIVATE ${distribution_DIR}/openssl/include)

target_link_libraries(
                native-lib
                my-lib
                )

target_link_libraries(
                neclic
                lib_crypto
                )

Я собрал APK и взял из него my-lib.so. Затем я создал новый проект, используя эту библиотеку (включая заголовки .h), и все работает как положено.

Мои вопросы: Есть ли лучший способ сделать это? Могу ли я ожидать каких-либо проблем при отправке этой библиотеки для интеграции с исходным кодом? Например, нужно ли им использовать одну и ту же версию NDK? Или «my-lib.so» можно использовать в любом приложении для Android, если поддерживается арка?

Спасибо!

1 Ответ

0 голосов
/ 29 октября 2018

Вообще говоря, вам не нужно отправлять libneclic.so для упаковки в JAR. Вы можете использовать его в своем APK как , если сторонним библиотекам, которые ваши коллеги разрабатывают снаружи, не нужна ваша библиотека в качестве зависимости.

На самом деле поддерживаемый способ распространения скомпилированных библиотек Java с нативными компонентами - это не JAR, а файлы AAR. Но это техническая составляющая, которая не важна для этого обсуждения.

Если вы используете libneclic.so непосредственно в вашем APK, то есть у вас есть класс (ы) Java, который использует JNI для вызова функций в вашей библиотеке, вы можете сохранить тот же CMakeList .txt в вашем проекте, или вы можете поместить встроенную библиотеку в папку JniLibs , и Android Studio выберет ее оттуда при упаковке APK.

С другой стороны, если созданная вами библиотека имеет экспортированные функции, которые будут вызываться из какой-либо сторонней библиотеки, убедитесь, что обе используют один и тот же общий STL (к счастью, в последнем выпуске 18 NDK существует только один общий STL доступна реализация, c ++ _ shared .

Настоятельно рекомендуется создавать библиотеки с одинаковой версией NDK, хотя, скорее всего, умеренная разница между этими версиями не приведет к отрицательным результатам. Каждый выпуск NDK вносит существенные улучшения не только в производительность, но и исправляет ошибки, в том числе некоторые проблемы безопасности.

Тем не менее, безопаснее договориться об общем более старом выпуске NDK, чем отслеживать все возможные несоответствия.

Обратите внимание, что по умолчанию CMake использует c ++ _ static STL для создания libneclic.so , и вы должны переопределить это, установив ANDROID_STL .

...