Как связать libjsoncpp с AOSP?
Я добавил код в Android Healthd, в том числе файл client.cpp, который использует.
Во время сборки Android я вижу следующие ошибки:
FAILED: out/soong/.intermediates/system/core/healthd/healthd/android_arm64_armv8-a_cortex-a53_core/unstripped/healthd
prebuilts/clang/host/linux-x86/clang-r353983c/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_dynamic/android_arm64_armv8-a_cortex-a53_core/crtbegin_dynamic.o @out/soong/.intermediates/system/core/healthd/healthd/android_arm64_armv8-a_cortex-a53_core/unstripped/healthd.rsp out/soong/.intermediates/hardware/interfaces/health/2.0/utils/libhealthservice/libhealthservice/android_arm64_armv8-a_cortex-a53_core_static/libhealthservice.a out/soong/.intermediates/hardware/interfaces/health/2.0/default/android.hardware.health@2.0-impl/android_arm64_armv8-a_cortex-a53_core_static/android.hardware.health@2.0-impl.a out/soong/.intermediates/hardware/interfaces/health/1.0/default/android.hardware.health@1.0-convert/android_arm64_armv8-a_cortex-a53_core_static/android.hardware.health@1.0-convert.a out/soong/.intermediates/hardware/interfaces/health/2.0/utils/libhealthstoragedefault/libhealthstoragedefault/android_arm64_armv8-a_cortex-a53_core_static/libhealthstoragedefault.a out/soong/.intermediates/system/core/healthd/libbatterymonitor/android_arm64_armv8-a_cortex-a53_core_static/libbatterymonitor.a -Wl,--start-group prebuilts/clang/host/linux-x86/clang-r353983c/lib64/clang/9.0.3/lib/linux/libclang_rt.builtins-aarch64-android.a prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/lib64/libatomic.a out/soong/.intermediates/build/soong/libgcc_stripped/android_arm64_armv8-a_cortex-a53_core_static/libgcc_stripped.a -Wl,--end-group out/soong/.intermediates/system/core/base/libbase/android_arm64_armv8-a_cortex-a53_core_shared/libbase.so out/soong/.intermediates/system/core/libcutils/libcutils/android_arm64_armv8-a_cortex-a53_core_shared/libcutils.so out/soong/.intermediates/system/libhidl/libhidlbase/android_arm64_armv8-a_cortex-a53_core_shared/libhidlbase.so out/soong/.intermediates/system/libhidl/libhidltransport/android_arm64_armv8-a_cortex-a53_core_shared/libhidltransport.so out/soong/.intermediates/system/libhwbinder/libhwbinder/android_arm64_armv8-a_cortex-a53_core_shared/libhwbinder.so out/soong/.intermediates/system/core/liblog/liblog/android_arm64_armv8-a_cortex-a53_core_shared/liblog.so out/soong/.intermediates/system/core/libutils/libutils/android_arm64_armv8-a_cortex-a53_core_shared/libutils.so out/soong/.intermediates/hardware/interfaces/health/2.0/android.hardware.health@2.0/android_arm64_armv8-a_cortex-a53_core_shared/android.hardware.health@2.0.so out/soong/.intermediates/hardware/interfaces/health/1.0/android.hardware.health@1.0/android_arm64_armv8-a_cortex-a53_core_shared/android.hardware.health@1.0.so out/soong/.intermediates/external/libcxx/libc++/android_arm64_armv8-a_cortex-a53_core_shared/libc++.so out/soong/.intermediates/bionic/libc/libc/android_arm64_armv8-a_cortex-a53_core_shared_10000/libc.so out/soong/.intermediates/bionic/libm/libm/android_arm64_armv8-a_cortex-a53_core_shared_10000/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_arm64_armv8-a_cortex-a53_core_shared_10000/libdl.so out/soong/.intermediates/bionic/libc/crtend_android/android_arm64_armv8-a_cortex-a53_core/obj/bionic/libc/arch-common/bionic/crtend.o -o out/soong/.intermediates/system/core/healthd/healthd/android_arm64_armv8-a_cortex-a53_core/unstripped/healthd -target aarch64-linux-android -Bprebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -fuse-ld=lld -Wl,--pack-dyn-relocs=android+relr -Wl,--use-android-relr-tags -Wl,--no-undefined -Wl,--hash-style=gnu -Wl,--icf=safe -Wl,-z,max-page-size=4096 -Wl,--fix-cortex-a53-843419 -pie -nostdlib -Bdynamic -Wl,--gc-sections -Wl,-z,nocopyreloc prebuilts/clang/host/linux-x86/clang-r353983c/lib64/clang/9.0.3/lib/linux/libclang_rt.ubsan_minimal-aarch64-android.a -Wl,--exclude-libs,libclang_rt.ubsan_minimal-aarch64-android.a -Wl,-execute-only -Wl,-dynamic-linker,/system/bin/linker64
ld.lld: error: undefined symbol: Json::Value::Value(Json::ValueType)
>>> referenced by client.cpp:19 (hardware/interfaces/health/2.0/default/client.cpp:19)
>>> client.o:(Client::parse_line(char*)) in archive out/soong/.intermediates/hardware/interfaces/health/2.0/default/android.hardware.health@2.0-impl/android_arm64_armv8-a_cortex-a53_core_static/android.hardware.health@2.0-impl.a
ld.lld: error: undefined symbol: Json::Reader::Reader()
>>> referenced by client.cpp:20 (hardware/interfaces/health/2.0/default/client.cpp:20)
>>> client.o:(Client::parse_line(char*)) in archive out/soong/.intermediates/hardware/interfaces/health/2.0/default/android.hardware.health@2.0-impl/android_arm64_armv8-a_cortex-a53_core_static/android.hardware.health@2.0-impl.a
...
Я добавил в раздел
hardware/interfaces/health/2.0/defaultAndroid.bp
:
cc_defaults {
name: "android.hardware.health@2.0-impl_defaults",
recovery_available: true,
cflags: [
"-Wall",
"-Werror",
"-std=gnu++17",
],
shared_libs: [
"libbase",
"libhidlbase",
"libhidltransport",
"libhwbinder",
"liblog",
"libutils",
"libcutils",
"android.hardware.health@2.0",
"libjsoncpp",
],
static_libs: [
"libbatterymonitor",
"android.hardware.health@1.0-convert",
],
}
// Helper library for implementing health HAL. It is recommended that a health
// service or passthrough HAL link to this library.
cc_library_static {
name: "android.hardware.health@2.0-impl",
defaults: ["android.hardware.health@2.0-impl_defaults"],
vendor_available: true,
srcs: [
"Health.cpp",
"healthd_common.cpp",
"powerd.cpp",
"client.cpp",
],
export_include_dirs: ["include"],
}
// Default passthrough implementation for recovery. Vendors can implement
// android.hardware.health@2.0-impl-recovery-<device> to customize the behavior
// of the HAL in recovery.
// The implementation does NOT start the uevent loop for polling.
cc_library_shared {
name: "android.hardware.health@2.0-impl-default",
defaults: ["android.hardware.health@2.0-impl_defaults"],
recovery_available: true,
relative_install_path: "hw",
static_libs: [
"android.hardware.health@2.0-impl",
"libhealthstoragedefault",
],
srcs: [
"HealthImplDefault.cpp",
],
}
Я уже успешно предоставил заголовки для libjsoncpp. Я не вижу эту ошибку, пока не добавлю код, который действительно использует.
Библиотека существует как часть ранее созданного образа Android:
smarc_mx8mq:/ # find / -name "libjsoncpp*" 2>/dev/null
/system/lib64/libjsoncpp.so
/system/lib64/vndk-sp-29/libjsoncpp.so
/system/lib/vndk-sp-29/libjsoncpp.so
Как мне сказать Android, что я хочу, чтобы меня связали?
Не следует даже пытаться разрешить эти символы до тех пор, пока
healthd
выполняется, поскольку они предоставляются разделяемой библиотекой.
Обновлять:
Я заметил, что другие библиотеки в
shared_libs
все присутствуют в командной строке, так как
.so
s, но
libjsoncpp
пропал, отсутствует.
Новый вопрос: почему
libcppjson
отсутствует в команде связывания?