Verknüpfen einer gemeinsam genutzten nativen Android-Bibliothek mit einer anderenAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Verknüpfen einer gemeinsam genutzten nativen Android-Bibliothek mit einer anderen

Post by Anonymous »

Ich versuche, einen Android-Build für eine native (C) Bibliothek zu erstellen (https://github.com/MayaPosch/nymphrpc). Diese Bibliothek ist selbst von einer anderen C-Bibliothek abhängig, Poco (https://github.com/pocoproject/poco).
Ich habe ein build.gradle.kts für Poco:

Code: Select all

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"
}
}
}
Da die Bibliothek, die ich zu erstellen versuche (nymphrpc), kein Build-System verwendet, das mit Gradle kompatibel zu sein scheint, habe ich eine einfache CMakeLists.txt dafür geschrieben:

Code: Select all

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
)
Dies funktioniert, um die Bibliothek auf meinem Linux-Desktop zu erstellen.
Um sie auf Android zu erstellen, habe ich die folgende Gradle-Datei geschrieben:

Code: Select all

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"))
}
Während der Erstellung wird Poco einwandfrei erstellt (eine AAR-Datei wird mit Headern, einer CMake-Konfiguration und Header-Dateien erstellt) und obwohl nymphrpc korrekt zu kompilieren scheint (also die Header und CMake-Dateien von Poco findet), schlägt die Verknüpfung fehl.

Code: Select all

[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
Soweit ich sehen kann, ist es aus irgendeinem Grund nicht wirklich mit Poco verknüpft, es erwähnt -latomic -lm, aber nicht -lPocoFoundation, wie ich es erwarten würde, aber ich kann nicht ableiten, warum das der Fall ist. Vor allem, weil dieses CMake-Setup hervorragend zum Erstellen einer regulären Linux-Bibliothek geeignet ist.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post