2i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
Compatibilidade com a biblioteca
C++
O NDK é compativel com varias bibliotecas de ambiente de execucdo C++. Este documento
traz informacGes sobre essas bibliotecas, como usé-las e as desvantagens de cada uma.
Bibliotecas de ambiente de execugdo C++
Tabela 1. Ambientes de execugdo e recursos do NDK C++.
Nome Recursos
libe++ (slibe) Compatibilidade com C++ moderno.
system (#system) new e delete. (Obsoleto em 18.)
none (#none) Nenhum cabecalho, C ++ limitado.
A libe++ esta disponivel como biblioteca estatica e compartilhada,
Aviso: 0 uso de ambientes de execucao estticos pode causar comportamentos inesperados. Consulte
a segdo Ambientes de execucdo estaticos (#static_runtimes) para saber mais.
libo++
A libo++ do LLVM (https:/libexs.livm.org) (link em inglés) & uma biblioteca C++ padrdo usada
pelo SO Android desde a verso Lollipop. Desde o NDK r18, ela é a Unica STL disponivel no
NDK.
Observacdo: para detalhes completos do nivel esperado de compatibilidade com bibliotecas C++ para
cada versio, consulte as paginas C++14 Status (https://ibexx livm.org/Status/Cxx14 html), C4417
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br2i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
Status (https://liboxx.livm.org/Status/Cxx17.html) e C4420 Status
(https://libcxx.livm.org/Status/Cxx20. html) (links em inglés). Anteriormente, a verso C++20 era
conhecida como C++2a. 0 nivel de suporte a linguagem C++ no compilador é ortogonal. Consulte
‘Suporte 4 C++ no Clang (https://clang livm.org/cxx_status.html) (link em inglés).
Por padrdo, o CMake usa qualquer versao de C++ definida como padrao pelo Clang
(atualmente, C++14). Portanto, vocé precisard definir 0 CMAKE_CXX_STANDARD padrao como
o valor adequado no arquivo CMakeLists. txt para usar recursos da versdo C+#17 ou
mais recentes. Consulte a documentagao do CMake sobre CMAKE_CXX_STANDARD
(https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_STANDARD.htm) (link em inglés) para
ver mais detalhes.
O ndk-build também deixa a decisdo para o Clang por padrao. Entdo, os usuarios do ndk-
build precisam usar APP_CPPFLAGS para adicionar -std=c++17 ou qualquer outra op¢ao.
A biblioteca compartilhada para libe++ 6 Libe++_shared.so, e a estatica é
libc++_static.a. Em casos tipicos, 0 sistema de compilagao processard 0 uso e 0
empacotamento dessas bibliotecas conforme necessério para 0 usuario. Para casos
atipicos ou ao implementar seu préprio sistema de compilagao, consulte o Guia de
mantenedores do sistema de compilacéo
(https://android. googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md) Ou 0
guia para usar outros sistemas de compilacdo
(https://developer.android.com/ndk/guides/other_build_systems?hl=pt-br).
Observagao: a libc++ ndo é uma biblioteca do sistema Se vocé usar a libe++_shared. so, ela precisara
ser incluida no seu app. Se estiver criando o app no Gradie, isso seré feito automaticamente.
0 projeto LLVM esté sob a licenga Apache v2.0 com excegées do LLVM. Para saber mais,
consulte 0 arquivo de licenca
(https://github.com/livm/livm-project/blob/main/libexx/LICENSE.TXT) (link em inglés).
system
O ambiente de execugao system refere-se a /system/Lib/libstde++. so. Essa biblioteca
no deve ser confundida com a libstde ++ completa do GNU. No Android, libstde ++ é
apenas new e delete. Use a libe++ como uma biblioteca C++ padrao completa.
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br 2182i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
‘STL do sistema seré removida em uma verso futura do NDK. Consulte Problema 744
(https://github.com/android-ndk/ndk/issues/744) (link em inglés).
O ambiente de execugao system do C++ oferece compatibilidade com a ABI basica do
ambiente de execugao C++. Simplificando, essa biblioteca fornece new e delete.
Diferentemente de outras opgGes disponiveis no NDK, nao hd compatibilidade com o
gerenciamento de excegdes ou com RTTI
Nao ha compatibilidade com a biblioteca padrao além dos wrappers C++ para os
cabeg¢alhos da biblioteca C, como . Se quiser uma STL, use uma das outras
opgdes apresentadas nesta pagina.
none
Ha também a opgiio de nao ter nenhuma STL. Nao ha requisitos de vinculagao ou
licenciamento nesse caso. Nao ha cabegalhos C++ padrao disponiveis.
Selecionar um ambiente de execugao C++
CMake
0 padrao para o CMake é c++_static.
E possivel especificar c++_shared, c++_static, none ou system com a variavel
ANDROID_STL no arquivo build.gradle do médulo. Para saber mais, consulte a
documentagao do ANDROID_STL
(https://developer.android.com/ndk/guides/cmake7hl=pt-br#tandroid_stl) no CMake.
ndk-build
O padrao para o ndk-build é none
Vocé pode especificar c++_shared, c++_static, none ou system com a varidvel APP_STL
no arquivo Application.mk (https://developer.android.com/ndk/guides/application_mk?hI=pt-br).
Exemplo:
APP_STL := c++_shared
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br 382i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
O ndk-build sé permite selecionar um ambiente de execugdo para seu app e apenas em
Application.mk (https://developer.android.com/ndk/quides/application_mk2hI=pt-br).
Usar clang diretamente
Se vocé estiver usando clang diretamente no seu sistema de compilagdo, o clang++ usaré
c++_shared por padrdo. Para usar a variante estatica, adicione -static-libstdc++ as
sinalizagées do vinculador. Observe que, embora a op¢o use o nome "libstdc++" por
motivos histéricos, o uso de libc++ também esté correto.
Consideragées importantes
Ambientes de execugao estaticos
Se todo o cédigo nativo do seu app estd em uma Unica biblioteca compartilhada,
recomendamos o uso do ambiente de execucao estatico. Desse modo, o vinculador podera
incorporar e suprimir 0 maximo possivel de cédigo nao usado, gerando um app otimizado e
de tamanho reduzido. Isso também evita que o PackageManager e o vinculador dinamico
apresentem bugs em versées antigas do Android que dificultam o gerenciamento de varias
bibliotecas compartilhadas e aumentam a propensao a erros.
Portanto, em C++, nao é seguro definir mais de uma cépia da mesma fungdo ou objeto em
um Ginico programa. Esse é um aspecto da Regra de uma definicdo
(http://en.cppreference.com/w/cpp/language/definition) (link em inglés) presente no padrao
cH.
Ao usar um ambiente de execugao estatico (e bibliotecas estaticas em geral), é facil violar
essa regra acidentalmente. Por exemplo, o app a seguir viola essa regra
# Application mk
APP_STL := c#+_static
# Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := foo
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br
482i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
LOCAL_SRC_FILES := foo.cpp
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.cpp
LOCAL_SHARED_LIBRARTES := foo
include $(BUILD_SHARED_LIBRARY)
Nesse caso, a STL, incluindo dados globais e construtores estéticos, estard presente nas
duas bibliotecas. 0 comportamento do ambiente de execugdo desse app é indefinido, e as
falhas séo muito comuns na pratica. Outros possiveis problemas incluem:
+ Ameméria alocada em uma biblioteca e liberada em outra causa vazamento de
meméria ou corrupgao do heap.
* As excegées geradas em 1ibfoo. so deixardo de ser detectadas em libbar.so,
fazendo com que seu app falhe,
* O buffer de std::cout nao funciona corretamente.
Além dos problemas comportamentais envolvidos, vincular o ambiente de execucao
estatico a varias bibliotecas duplicaré o cédigo em todas as bibliotecas compartilhadas,
aumentando o tamanho do app.
Em geral, sé sera possivel usar uma variante estatica do ambiente de execugdo C++ se
houver somente uma biblioteca compartilhada no seu app.
Observagao: essa regra se aplica tanto ao cédigo quanto as dependéncias terceirizadas.
Ambientes de execugao compartilhados
Cuidado: bibliotecas JNI distribuidas com Java AARs nao podem usar o ambiente de execugao
compartilhado para evitar conflito com outras bibliotecas e 0 app. Os avisos abaixo ainda se aplicam.
Consulte a documentagao de Fornecedor do middleware
(https://android.googlesource.com/platform/ndk/+/refs/heads/master/docs/user/middleware_vendors
md)
(link em inglés) para saber mais.
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br 582i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
Caso seu app inclua varias bibliotecas compartilhadas, use libe++_shared.so
No Android, a libc++ usada pelo NDK ndo é a mesma que faz parte do SO. Isso dé aos.
usudrios do NDK acesso aos recursos e corregdes de bugs mais recentes da libc++,
mesmo em versées antigas do Android. A desvantagem é que, se vocé usar a
Libot+ shared. so, seré necessério inclut-la no app. Se estiver criando o app no Gradle,
isso sera feito automaticamente.
As versées antigas do Android tinham bugs no PackageManager e no vinculador dinamico
que faziam com que a instalagdo, a atualizagao e 0 carregamento de bibliotecas nativas
ndo fossem feitos de modo confidvel. Principalmente se o app for destinado a uma versao
do Android anterior & 4.3 (API de nivel 18 do Android) e vocé usar 1ibe++_shared.so, serd
necessario carregar a biblioteca compartilhada antes de qualquer outra biblioteca que
dependa dela.
O projeto ReLinker (https://github.com/KeepSafe/ReLinker) oferece solugdes para todos os
problemas de carregamento de biblioteca nativa conhecidos e costuma ser uma op¢ao
melhor do que desenvolver solugées préprias.
Uma STL por app
Anteriormente, o NDK era compativel com as bibliotecas libstdc++ e STLport do GNU, além
da libe++. Se 0 app depende de bibliotecas pré-criadas em um NDK diferente daquele
usado para criar seu app, garanta que ele faa isso de maneira compativel
Os apps nao devem usar mais de um ambiente de execugao C++. As varias STLs nao so
compativeis entre si. Por exemplo, o layout de std: :string na libct+ no é 0 mesmo que
em gnustl. Cédigos escritos com uma STL nao poderdo usar objetos escritos com outra.
Esse & apenas um exemplo, Existem muitas outras incompatibilidades.
Observagai
excegdo a essa regra é que ‘nenhuma STL’ ndo conta como uma STL. Vocé pode usar
bibliotecas somente C tranquilamente (ou até mesmo os ambientes de execucao none (#none) ou
system (#system), jd que eles ndo so STLs) no mesmo app que uma STL. Essa regra se aplica
somente a libo++ (#libe), gnustl e stIport.
Aviso: o vinculador pode pegar alguns desses problemas no tempo de compilagao, mas muitos desses
problemas se manifestam apenas como uma falha ou um comportamento estranho no tempo de
execugao.
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br 282i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
Essa regra nao se aplica somente ao seu cédigo. Todas as dependéncias precisam usar a
mesma STL que vocé selecionou. Se vocé precisa de uma dependéncia terceirizada de
cédigo fechado que usa a STL e nao fornece uma biblioteca por STL, nao é possivel
escolher a STL. Use a mesma STL como sua dependéncia.
E possivel depender de duas bibliotecas incompativeis entre si. Nessa situagao, as Unicas
solugdes sao eliminar uma das dependéncias ou solicitar que o responsével fornega uma
biblioteca compilada com a outra STL.
Observagao: tentamos manter a compatibilidade com a ABI entre as versées do NDK. No entanto, isso
em sempre é possivel. Para maior compatibilidade, além de usar a mesma STL como dependéncias,
use também a mesma verso do NDK sempre que possivel
Excegées de C++
Alibc++ & compativel com excecées de C++, mas elas sao desativadas por padrao no ndk-
build. Isso ocorre porque, anteriormente, as excecdes C+ ndo estavam disponiveis no
NDK. 0 CMake e os conjuntos de ferramentas auténomas tém excegdes C++ ativadas por
padrao.
Para ativar excegdes em todo o app no ndk-build, adicione a seguinte linha ao arquivo
Ay
lication.mk (https://developer.android.com/ndk/guides/application_mk?hl=pt-br):
‘APP_CPPFLAGS
-fexceptions
Para ativar exce¢des em um Unico médulo do ndk-build, adicione a seguinte linha ao
médulo correspondente no Android.mk
(https://developer.android.com/ndk/guides/android_mk?hi=pt-br):
LOCAL_CPP_FEATURES :
exceptions
Como alternativa, vocé pode usar:
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br 7182i0si2023, 07.25, Compatiilidade com a biiotaca C++ | Android NOK | Android Davelopers
LOCAL_CPPFLAGS := -fexceptions
RTTI
Assim como as excecées, a libc++ € compativel com RTTI, mas esse recurso é desativado
por padrao no ndk-build. A RTT! é ativada por padrdo no CMake e nos conjuntos de
ferramentas auténomos.
Para ativar a RTTI em todo o app no ndk-build, adicione a seguinte linha ao arquivo
Ay
lication.mk (https://developer.android.com/ndk/guides/application_mk?hi=pt-br):
‘APP_CPPFLAGS
-frtti
Para ativar a RTTI em um Unico médulo do ndk-build, adicione a seguinte linha ao médulo
correspondente no Android.mk (https://developer.android.com/ndk/guides/android_mk?hl=pt-br):
LOCAL_CPP_FEATURES := rtti
Como alterativa, vocé pode usar:
LOCAL_CPPFLAGS := -frtti
O contetido e os exemplos de cédigo nesta pagina esto sujeitos as licengas descritas na Licenea de contetida
(https://developer.android.com/license?hi=pt-br). Java e OpenJOK so marcas registradas da Oracle e/ou
suas afiiadas
Ultima atualizagéo 2022-02-08 UTC.
hitpsideveloper android. comnakiguidesiepp-support?hi=pt-br 3B