Связывание общей собственной библиотеки Android с другойAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Связывание общей собственной библиотеки Android с другой

Сообщение Anonymous »

Я пытаюсь создать сборку Android для собственной библиотеки (C) (https://github.com/MayaPosch/nymphrpc). Эта библиотека зависит от другой библиотеки C, Poco (https://github.com/pocoproject/poco).
У меня есть build.gradle.kts для Poco:

Код: Выделить всё

plugins {
id("com.android.library")
}

android {
namespace = "org.pocoproject.poco"
compileSdk = 36
ndkVersion = "26.1.10909125"

defaultConfig {
minSdk = 21
targetSdk = 21

externalNativeBuild {
cmake {
arguments += "-DANDROID_STL=c++_shared"
}
}
}

externalNativeBuild {
cmake {
path = file("../../../poco/CMakeLists.txt")
}
}

buildFeatures {
prefab = true
prefabPublishing = true
}

prefab {
create("Data") {
headers = "../../../poco/Data/include"
}

create("Foundation") {
headers = "../../../poco/Foundation/include"
}

create("JSON") {
headers = "../../../poco/JSON/include"
}

create("Net") {
headers = "../../../poco/Net/include"
}

create("Util") {
headers = "../../../poco/Util/include"
}
}
}
Поскольку библиотека, которую я пытаюсь собрать (nymphrpc), не использует систему сборки, совместимую с Gradle, я написал для нее простой CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.10)

project(
nymphrpc
VERSION 0.1
LANGUAGES CXX
)

find_package(Poco COMPONENTS Foundation Net JSON REQUIRED CONFIG)

set(SRC
...
)

set(HEADERS
...
)

add_library(
nymphrpc SHARED
${SRC}
)

target_link_libraries(
nymphrpc PRIVATE
Poco::Foundation
Poco::JSON
Poco::Net
)

target_include_directories(
nymphrpc
PUBLIC
$
$
)

set_target_properties(
nymphrpc PROPERTIES
SOVERSION ${PROJECT_VERSION_MAJOR}
VERSION ${PROJECT_VERSION}
)

install(
TARGETS nymphrpc LIBRARY
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/nymph
)

install(
FILES ${HEADERS}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/nymph
)
Это подходит для сборки библиотеки на моем рабочем столе Linux.
Чтобы собрать ее на Android, я написал следующий файл Gradle:

Код: Выделить всё

plugins {
id("com.android.library")
}

android {
namespace = "ws.nyanko.nymphrpc"
compileSdk = 36
ndkVersion = "26.1.10909125"

defaultConfig {
minSdk = 21
targetSdk = 21

externalNativeBuild {
cmake {
arguments += "-DANDROID_STL=c++_shared"
}
}
}

externalNativeBuild {
cmake {
path = file("../../../nymphrpc/CMakeLists.txt")
}
}

buildFeatures {
prefab = true
prefabPublishing = true
}

prefab {
create("nymphrpc") {
headers = "../../../nymphrpc/src"
}
}
}

dependencies {
implementation(project(":Poco"))
}
При сборке все Poco собирается нормально (файл AAR создается с помощью библиотек (), файлы конфигурации и заголовков CMake), и хотя nymphrpc, кажется, компилируется правильно (поэтому он находит заголовки Poco и файлы CMake), он не может связать их.

Код: Выделить всё

[15/15] Linking CXX shared library /path/to/repo/build/nymphrpc/intermediates/cxx/Debug/2k5x57b1/obj/arm64-v8a/libnymphrpc.so
FAILED: /path/to/repo/build/nymphrpc/intermediates/cxx/Debug/2k5x57b1/obj/arm64-v8a/libnymphrpc.so
: &&  /var/lib/android-sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --sysroot=/var/lib/android-sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security   -fvisibility=default -fno-limit-debug-info  -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments  -Wl, --no-undefined -shared -Wl,-soname,libnymphrpc.so -o /path/to/repo/build/nymphrpc/intermediates/cxx/Debug/2k5x57b1/obj/arm64-v8a/libnymphrpc.so src/CMakeFiles/nymphrpc.dir/callback_request.cpp.o src/CMakeFiles/nymphrpc.dir/dispatcher.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_listener.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_logger.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_message.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_method.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_server.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_session.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_socket_listener.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_types.cpp.o src/CMakeFiles/nymphrpc.dir/nymph_utilities.cpp.o src/CMakeFiles/nymphrpc.dir/remote_client.cpp.o src/CMakeFiles/nymphrpc.dir/remote_server.cpp.o src/CMakeFiles/nymphrpc.dir/worker.cpp.o  -latomic -lm && :
ld.lld: error: undefined symbol: Poco::Mutex::Mutex()
>>> referenced by nymph_listener.cpp:41 (/path/to/repo/nymphrpc/src/nymph_listener.cpp:41)
>>>               src/CMakeFiles/nymphrpc.dir/nymph_listener.cpp.o:(__cxx_global_var_init.1)
>>> referenced by nymph_listener.cpp:54 (/path/to/repo/nymphrpc/src/nymph_listener.cpp:54)
>>>               src/CMakeFiles/nymphrpc.dir/nymph_listener.cpp.o:(NymphListener::callbacksMutex())
>>> referenced by nymph_socket_listener.cpp:34 (/path/to/repo/nymphrpc/src/nymph_socket_listener.cpp:34)
>>>               src/CMakeFiles/nymphrpc.dir/nymph_socket_listener.cpp.o:(NymphSocketListener::NymphSocketListener(NymphSocket, Poco::Condition*, Poco::Mutex*))
>>> referenced 9 more times
Насколько я вижу, он по какой-то причине на самом деле не ссылается на Poco, он упоминает -latomic -lm, но не -lPocoFoundation, как я ожидал, но я не могу понять, почему это так. Тем более, что эта установка CMake отлично подходит для создания обычной библиотеки Linux.

Подробнее здесь: https://stackoverflow.com/questions/798 ... to-another
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»