Xamarin - попытка загрузить libtbb.so приводит к тому, что "libc.so" не находит сообщение во время выполнения - PullRequest
0 голосов
/ 30 апреля 2018

Я занимаюсь разработкой приложения с использованием Xamarin.Forms и в настоящее время тестирую его на телефоне Android (Android 6, armeabi-v7a). Целевой API - 21, на моей машине работает Windows. Я также использую несколько собственных библиотек, собранных NDK, но для изоляции я создал одну маленькую библиотеку, которая ничего не делает, кроме как возвращает число из одной экспортированной функции.

Теперь мне нужно связать библиотеку Intel TBB с моей нативной библиотекой, поэтому я собираю ее, используя инструменты сборки ndk и клон репозитория TBB:

ndk-build target=android tbb tbb_os=windows arch=armeabi-v7a

В результате появились библиотеки libtbb.so и libtbb_debug.so, которые я затем добавил в свой проект Android Xamarin как AndroidNativeLibrary, дополнительно установил <Abi>armeabi-v7a</Abi> и скопировал в каталог назначения, скомпилировал и развернул на моем телефоне.

Также у меня есть некоторый тестовый код на C # только для вызова нативной библиотеки (которая прекрасно работает без привязки TBB).

Вот проблема - после связывания TBB (даже без использования чего-либо из библиотеки TBB) происходит сбой кода при попытке загрузить собственную библиотеку с сообщением:

DllImport error loading library 'libmyproject_experimental.so': 'dlopen failed: cannot find "libc.so" from verneed[0] in DT_NEEDED list for "/data/app/com.example.myapp.myproject-1/lib/arm/libtbb.so"'.

Итак, я создал новый проект в своем проекте Xamarin для TBB, добавил источники TBB, установил правильные флаги, чтобы код собирался правильно (я установил те же флаги, что и в выходных данных ndk-build), и добавил ссылку на проект TBB в свой экспериментальный библиотека. Это просто перенесло проблему из TBB в мою библиотеку:

DllImport error loading library 'libmyproject_experimental.so': 'dlopen failed: cannot find "libc.so" from verneed[0] in DT_NEEDED list for "/data/app/com.example.myapp.myproject-1/lib/arm/libmyproject_experimental.so"'.

Я также изменил STL на libc ++ _, доступный повсеместно, включил исключения и RTTI и установил c ++ 1y в качестве стандарта C ++. Также я использую Clang 5.0.

Есть идеи, как решить эту проблему?

РЕДАКТИРОВАТЬ: когда я собираю TBB в MSVS как статическую библиотеку, в сообщении теперь говорится, что он не может найти "libm.so" (который также необходим TBB)

1 Ответ

0 голосов
/ 30 апреля 2018

Чтобы ответить на мой вопрос:

Я решил это путем перенастройки проекта и некоторыми из следующих действий:

  • построение библиотеки TBB как статической
  • с использованием статической версии libc ++
  • повышение минимального уровня API до 21 (раньше было 19)

Однако я не уверен, в чем была настоящая проблема.

РЕДАКТИРОВАТЬ: общая идея сделать статическую связь пришла отсюда: https://software.intel.com/en-us/forums/intel-threading-building-blocks/topic/623425

...