Não é possível incluir cabeçalhos C ++ como vetor no Android NDK

83

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!

Nitrex88
fonte
2
Primeiro, verifique o diretório android-ndk-r5 \ build \ plataformas \ android- X\ arch-arm \ usr \ include - está vectorrealmente lá?
Seva Alekseyev
2
Não não é! Não sei muito sobre como o NDK funciona, além de usar JNI e compilar os códigos-fonte. Como posso fazer com que o vetor esteja lá? Eu vejo vetor em android-ndk-r5b / sources / cxx-stl / stlport / stlport se isso significa alguma coisa. Obrigado pela resposta rápida e agradeço muito!
Nitrex88
2
@seva Tentei executar várias ferramentas para reconstruir o conjunto de ferramentas e os pré-compilados (os arquivos .sh na pasta de ferramentas do NDK) e ainda não consegui fazer os cabeçalhos STL funcionarem. Se eu baixar o NDK novo do site do Android, tudo não funcionará? Eu tentei e um download recente não mudou nada. Mais alguma informação sobre o assunto que você poderia oferecer?
Nitrex88
[foi assim que configurei o STLPort para funcionar com o Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian
[foi assim que configurei o STLPort para funcionar com o Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

Respostas:

121

É possível. Aqui estão alguns passos a passo:

Em $ PROJECT_DIR / jni / Application.mk :

APP_STL                 := stlport_static

Tentei usar stlport_shared, mas sem sorte. Mesmo com libstdc ++.

Em $ PROJECT_DIR / jni / Android.mk :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

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.

Sebastian Roth
fonte
5
Obrigado obrigado !! Você finalmente resolveu meu problema. Acontece que meu Application.mk estava no lugar errado! Eu o tinha na pasta do projeto, mas não na pasta JNI (não sei por que, mas desde que comecei o desenvolvimento do Android, sempre pensei que fosse para lá). Ver você colocar o caminho do Application.mk na pasta jni me fez perceber. Obrigado e você ganha a recompensa!
Nitrex88
2
Simplesmente criar o Application.mk necessário resolveu, mas vejo a mensagem Android NDK: You might want to use $NDK/build/tools/build-stlport.sh. NOTA: isso não funcionou no cygwin
Alguém em algum lugar
Olá, sou capaz de construir um aplicativo que usa vetor.
CoDe
Olá, adicionei APP_STL: = stlport_static no arquivo Application.mk e está funcionando para meu aplicativo, mas o mesmo aplicativo que incluí no Android Source, aqui está o erro "classe de vetor não encontrada .." durante a compilação do código. pls sugere-me que qualquer um tenha ideia sobre isso.
CoDe
1
Talvez você possa fazer upload de uma amostra do seu projeto para o github e compartilhar a URL, então podemos dar uma olhada.
Sebastian Roth
20

Se 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"
        }
    }
}
rlcoder
fonte
1
Por que stlport_sharede não stlport_static?
IgorGanapolsky
9

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
    }

    ...

}
kynnysmatto
fonte
Ei, estou tendo este problema com o ffmpeg, na verdade ndk build está funcionando bem e está gerando arquivos .so com êxito, mas os arquivos de cabeçalho estão faltando, você tem alguma idéia sobre isso? (Estou usando o Android Studio com o plugin gradle experimental)
Pushpendra
Isso é com o plugin gradle-experimental?
Sebastian Roth
Por que em gnustl_sharedvez de gnustl_static?
IgorGanapolsky
Funciona, acho que isso deve ser selecionado como a resposta.
Vishnudev K
Tentei fazer isso com o Android Studio 2.1.3 mais recente e parece não funcionar. Para testá-lo, peguei o aplicativo de amostra HelloJNI, renomeei hello-jni.c para .cpp e adicionei um #include <vector> a ele. Recebo o erro: 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?
SideLobe
4

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:

APP_STL := stlport_static

Mas infelizmente não resolve o meu problema! Tenho que adicionar essas 3 linhas em Android.mk para resolvê-lo:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

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.

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif
LOCAL_SHARED_LIBRARIES += libstlport

Espero que isso seja útil.

Gary
fonte
Só para ficar claro, quando você diz "mesma pasta jni", está se referindo à pasta jni do projeto Android? Quero ter certeza de que não há outro local que eu deva saber. observação lateral: esse bom link de compartilhamento está morto agora :(
Hunter-Orionnoir
4

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/stlportpara Incluir diretórios

Clique em Sim quando uma caixa de diálogo for exibida.

Diálogo

Antes

Antes

Depois de

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 .

Maksim Dmitriev
fonte
3

Se você estiver usando ndk r10c ou posterior, basta adicionar APP_STL = c ++ _ static a Application.mk

clark.li
fonte
1

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.

Fedorov7890
fonte