Допустим, я собираюсь поставить AAR, который включает библиотеку C++(jni). Документы Android предлагают поставлять единую нативную библиотеку, которая статически связывает libc++ и скрывает все символы, кроме Java_xxx. Одним из наиболее важных аргументов является тот факт, что если вы связываете libc++_shared.so, вы должны отправить эту библиотеку с вашим aar, и она может конфликтовать с libc++_shares.so другого aar или с собственной библиотекой приложения. Ну, это довольно ясно.
Тем не менее, я все еще хочу поставлять свою библиотеку с общей версией libc++.
Другого варианта быть не может? Как описано Здесь Это LLVM LIBC ++, и это возможно построить его с помощью SIMILESIFIESTIIFIFIESTIIFIFIESTIIFIFIESTIIFIFIESTIIFIFIESTIIFIFITIIFIORSIIFIS IMILESTIIFISIIFIS. >
LIBCXX_ABI_NAMESPACE:STRING¶ По умолчанию: __n, где n — текущая версия ABI.
Эта опция определяет имя встроенного пространства имен управления версиями ABI. Его можно использовать для создания пользовательских версий libc++ с уникальными именами символов, чтобы предотвратить конфликты или проблемы ODR с другими версиями libc++.
Итак, план состоит в том, чтобы создать пользовательскую библиотеку libc++ с уникальным LIBCXX_ABI_NAMESPACE (например, __iddqd), библиотеку имен с уникальным префиксом (my_libc++.so), собрать мою библиотеку с этой my_libc++.so вместо Android libc++ и все. Нет конфликтов со сторонними программами и приложениями, но по-прежнему используется общая версия libc++.
Есть ли в этом смысл? Я пропустил что-то важное? Кто-нибудь сталкивался с таким подходом?
но что такое libc++ для Android?
у этой штуки другое название
Android не предоставляет libc++ (в отличие, например, от ios). Когда вы создаете нативную библиотеку с помощью libc++, вы должны поставлять libc++_shared.so. Gradle обычно подхватывает его из NDK, они отличаются от версии к версии NDK. Проблема в том, что если кто-то еще отправляет libc++_shared.so в разные aar в одном и том же приложении, они могут иметь разные версии, но только одна из них окажется в конечном приложении, и только одна будет загружена как загрузчик библиотеки. Так что это может сломать либо мой аар, либо их аар с малопонятными вылетами.
«вместо Android libc++». есть llvm, но не андроид.
NDK предоставляет libc++ llvm (который при необходимости поставляется с aar/app), согласно документации, см. ссылку, которую я предоставил. Операционная система Android не содержит общесистемных.
Да. я видел как
libc++
альтернативу, которая не требует лицензии