Quando tento incluir qualquer classe C ++ como vetor em meu projeto Android NDK (usando NDK r5b, o mais recente), recebo um erro como o seguinte ...
Compile++ thumb : test-libstl <= test-libstl.cpp
/Users/nitrex88/Desktop/Programming/EclipseProjects/STLTest/jni/test-libstl.cpp:3:18: error: vector: No such file or directory
Outras pessoas que relataram esse problema online afirmaram ter sucesso adicionando
APP_STL := stlport_static
ao arquivo Application.mk. Eu fiz isso e também tentei todos os outros valores possíveis para APP_STL. Limpei o projeto, executei ndk-build clean, apaguei as pastas obj e libs e ainda quando compilo não consigo encontrar a classe vetorial. Estou trabalhando nisso há várias semanas (desde que o NDK r5 foi lançado) e gostaria muito se alguém tivesse algum conselho. Obrigado!
fonte
X
\ arch-arm \ usr \ include - estávector
realmente lá?Respostas:
É possível. Aqui estão alguns passos a passo:
Em $ PROJECT_DIR / jni / Application.mk :
Tentei usar stlport_shared, mas sem sorte. Mesmo com libstdc ++.
Em $ PROJECT_DIR / jni / Android.mk :
Nada de especial aqui, mas certifique-se de que seus arquivos sejam .cpp .
Em $ PROJECT_DIR / jni / hello-jni.cpp :
#include <string.h> #include <jni.h> #include <android/log.h> #include <iostream> #include <vector> #define LOG_TAG "hellojni" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #ifdef __cplusplus extern "C" { #endif // Comments omitted. void Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { std::vector<std::string> vec; // Go ahead and do some stuff with this vector of strings now. } #ifdef __cplusplus } #endif
A única coisa que me incomodou aqui foi #ifdef __cplusplus.
Observe os diretórios.
Para compilar, use
ndk-build clean && ndk-build
.fonte
Android NDK: You might want to use $NDK/build/tools/build-stlport.sh
. NOTA: isso não funcionou no cygwinSe você estiver usando o Android Studio e ainda estiver vendo a mensagem "erro: vetor: nenhum arquivo ou diretório" (ou outros erros relacionados a stl) ao compilar usando ndk, isso pode ajudá-lo.
Em seu projeto, abra o arquivo build.gradle do módulo (não o build.grade do seu projeto, mas aquele que é para o seu módulo) e adicione 'stl "stlport_shared"' dentro do elemento ndk em defaultConfig.
Por exemplo:
android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.domain.app" minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.0" ndk { moduleName "myModuleName" stl "stlport_shared" } } }
fonte
stlport_shared
e nãostlport_static
?Estou usando o Android Studio e, desde 19 de janeiro de 2016, isso funcionou para mim. (Isso parece algo que muda a cada ano ou assim)
Acesse: app -> Gradle Scripts -> build.gradle (Módulo: app)
Em seguida, no modelo {... android.ndk {... e adicione uma linha: stl = "gnustl_shared"
Como isso:
model { ... android.ndk { moduleName = "gl2jni" cppFlags.add("-Werror") ldLibs.addAll(["log", "GLESv2"]) stl = "gnustl_shared" // <-- this is the line that I added } ... }
fonte
gnustl_shared
vez degnustl_static
?fatal error: 'vector' file not found #include <vector>
há alguma etapa adicional necessária após adicionar stl = "gnustl_static" ou "gnustl_shared" ao arquivo gradle do módulo?Mesmo Sebastian tinha dado uma boa resposta há mais 3 anos atrás, eu ainda gostaria de compartilhar uma nova experiência aqui, caso você enfrente o mesmo problema que eu na nova versão do ndk.
Tenho erros de compilação como:
fatal error: map: No such file or directory fatal error: vector: No such file or directory
Meu ambiente é android-ndk-r9d e adt-bundle-linux-x86_64-20140702. Eu adiciono o arquivo Application.mk na mesma pasta jni e insiro uma (e apenas uma) linha:
Mas infelizmente não resolve o meu problema! Tenho que adicionar essas 3 linhas em Android.mk para resolvê-lo:
E eu vi um bom compartilhamento daqui que diz "'stlport_shared' é o preferido". Portanto, talvez seja uma solução melhor usar stlport como uma biblioteca compartilhada em vez de estática. Basta adicionar as seguintes linhas em Android.mk e não há necessidade de adicionar o arquivo Application.mk.
Espero que isso seja útil.
fonte
Deixe-me adicionar um pouco a resposta de Sebastian Roth.
Seu projeto pode ser compilado usando
ndk-build
a linha de comando após adicionar o código que Sebastian postou. Mas, quanto a mim, havia erros de sintaxe no Eclipse e eu não tinha autocompletar de código.Observe que seu projeto deve ser convertido em um projeto C / C ++.
Como converter um projeto C / C ++
Para corrigir esse problema, clique com o botão direito em seu projeto e clique em Propriedades
Escolha C / C ++ Geral -> Caminhos e Símbolos e inclua o
${ANDROID_NDK}/sources/cxx-stl/stlport/stlport
para Incluir diretóriosClique em Sim quando uma caixa de diálogo for exibida.
Antes
Depois de
Atualização # 1
GNU C. Adicionar diretórios, reconstruir. Não haverá quaisquer erros no C arquivos de origem
GNU C ++. Adicione diretórios, reconstrua. Não haverá erros nos arquivos de origem do CPP .
fonte
Se você estiver usando ndk r10c ou posterior, basta adicionar APP_STL = c ++ _ static a Application.mk
fonte
Isso é o que causou o problema no meu caso (
CMakeLists.txt
):set (CMAKE_CXX_FLAGS "...some flags...")
Torna invisíveis todos os diretórios de inclusão definidos anteriormente. Depois de remover / refatorar esta linha, tudo funciona bem.
fonte
No Android NDK, vá para android-ndk-r9b> / sources / cxx-stl / gnu-libstdc ++ / 4.X / inclua em máquinas Linux
Encontrei a solução no link abaixo http://osdir.com/ml/android-ndk/2011-09/msg00336.html
fonte