Пользовательская libС++ для Android

avatar
Hsilgos
8 августа 2021 в 22:15
140
0
0

Допустим, я собираюсь поставить 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++.

Есть ли в этом смысл? Я пропустил что-то важное? Кто-нибудь сталкивался с таким подходом?

Источник
Алексей Неудачин
8 августа 2021 в 22:35
0

но что такое libc++ для Android?

Алексей Неудачин
8 августа 2021 в 22:42
0

у этой штуки другое название

Hsilgos
9 августа 2021 в 07:10
0

Android не предоставляет libc++ (в отличие, например, от ios). Когда вы создаете нативную библиотеку с помощью libc++, вы должны поставлять libc++_shared.so. Gradle обычно подхватывает его из NDK, они отличаются от версии к версии NDK. Проблема в том, что если кто-то еще отправляет libc++_shared.so в разные aar в одном и том же приложении, они могут иметь разные версии, но только одна из них окажется в конечном приложении, и только одна будет загружена как загрузчик библиотеки. Так что это может сломать либо мой аар, либо их аар с малопонятными вылетами.

Алексей Неудачин
9 августа 2021 в 08:51
0

«вместо Android libc++». есть llvm, но не андроид.

Hsilgos
9 августа 2021 в 10:32
0

NDK предоставляет libc++ llvm (который при необходимости поставляется с aar/app), согласно документации, см. ссылку, которую я предоставил. Операционная система Android не содержит общесистемных.

Алексей Неудачин
9 августа 2021 в 10:48
0

Да. я видел как libc++ альтернативу, которая не требует лицензии

Ответы (0)