Как прилинковать libusb к QT Android приложению

Собрал https://libusb.info/ для Android $ /opt/Android/ndk/21.3.6528147/build/ndk-build

[armeabi-v7a] Compile thumb  : usb1.0 <= core.c
[armeabi-v7a] Compile thumb  : usb1.0 <= descriptor.c
[armeabi-v7a] Compile thumb  : usb1.0 <= hotplug.c
[armeabi-v7a] Compile thumb  : usb1.0 <= io.c
[armeabi-v7a] Compile thumb  : usb1.0 <= sync.c
[armeabi-v7a] Compile thumb  : usb1.0 <= strerror.c
[armeabi-v7a] Compile thumb  : usb1.0 <= linux_usbfs.c
[armeabi-v7a] Compile thumb  : usb1.0 <= events_posix.c
[armeabi-v7a] Compile thumb  : usb1.0 <= threads_posix.c
[armeabi-v7a] Compile thumb  : usb1.0 <= linux_netlink.c
[armeabi-v7a] SharedLibrary  : libusb1.0.so
[armeabi-v7a] Install        : libusb1.0.so => libs/armeabi-v7a/libusb1.0.so

В CMakeLists.txt добавил

include_directories("/usr/local/include")

add_library(lib_usb SHARED IMPORTED)
set_target_properties(lib_usb PROPERTIES IMPORTED_LOCATION
                      /home/sba/projects/libs/libusb/android/libs/armeabi-v7a/libusb1.0.so)

target_link_libraries(${PROJECT_NAME} PRIVATE
  Qt${QT_VERSION_MAJOR}::Core
  Qt${QT_VERSION_MAJOR}::Quick
  lib_usb
)

Приложение собирается, но, насколько я понял, сам файл библиотеки в APK не добавляется. Полагаю это из-за того, что я не сделал следующий шаг include libusb.mk из libusb/android/README. Как это соотносится с CMakeLists.txt - не понятно.

Installing:

If you wish to use libusb from native code in own Android application then you should add the following line to your Android.mk file:

include $(PATH_TO_LIBUSB_SRC)/android/jni/libusb.mk

You will then need to add the following lines to the build configuration for each native binary which uses libusb:

LOCAL_C_INCLUDES += $(LIBUSB_ROOT_ABS) LOCAL_SHARED_LIBRARIES += libusb1.0

The Android build system will then correctly include libusb in the application package (APK) file, provided ndk-build is invoked before the package is built.

В /usr/local/include попал заголовочный файл для сборки библиотеки под Linux. Это альтернатива, хотя и спорная, шагу LOCAL_C_INCLUDES

В результате во время запуска под Android я получаю ошибку

AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libusb1.0.so" not found

Также я пробовал собрать libusb статически, хоть это и не рекомендуемый путь. Поборов сложности с зависимостями (LOCAL_LDLIBS := -llog), я смог запустить приложение. Но оно падает с ошибкой

F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 31913 (qtMainLoopThrea)

прямо во время инициализации библиотеки

int r = libusb_init(nullptr);
if (r < 0) return r;

Основная задача - чтение/запись данных из устройства подключенного к USB порту смартфона. Возможно задача на с++ и Qt решается иным образом нежели использование libusb


Ответы (0 шт):