Can't include C++ headers like vector in Android NDK Can't include C++ headers like vector in Android NDK android android

Can't include C++ headers like vector in Android NDK


It is possible. Here is some step by step:

In $PROJECT_DIR/jni/Application.mk:

APP_STL                 := stlport_static

I tried using stlport_shared, but no luck. Same with libstdc++.

In $PROJECT_DIR/jni/Android.mk:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jniLOCAL_SRC_FILES := hello-jni.cppLOCAL_LDLIBS    := -lloginclude $(BUILD_SHARED_LIBRARY)

Nothing special here, but make sure your files are .cpp.

In $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 __cplusplusextern "C" {#endif// Comments omitted.    voidJava_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

The only thing that bite me here was #ifdef __cplusplus.

Watch the directories.

To compile, use ndk-build clean && ndk-build.


If you are using Android studio and you are still seeing the message "error: vector: No such file or directory" (or other stl related errors) when you're compiling using ndk, then this might help you.

In your project, open the module's build.gradle file (not your project's build.grade, but the one that is for your module) and add 'stl "stlport_shared"' within the ndk element in defaultConfig.

For eg:

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"        }    }}


I'm using Android Studio and as of 19th of January 2016 this did the trick for me. (This seems like something that changes every year or so)

Go to: app -> Gradle Scripts -> build.gradle (Module: app)

Then under model { ... android.ndk { ... and add a line: stl = "gnustl_shared"

Like this:

model {    ...    android.ndk {        moduleName = "gl2jni"        cppFlags.add("-Werror")        ldLibs.addAll(["log", "GLESv2"])        stl = "gnustl_shared"     //  <-- this is the line that I added    }    ...}