Você está na página 1de 8
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-br 2i0si2023, 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 218 2i0si2023, 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 38 2i0si2023, 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 48 2i0si2023, 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 58 2i0si2023, 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 28 2i0si2023, 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 718 2i0si2023, 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

Você também pode gostar