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

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

Posted by: admin November 30, 2017 Leave a comment

Questions:

When I try to include any C++ class like vector in my Android NDK project (using NDK r5b, the latest), I get an error like the following…

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

Other people who reported this issue online have claimed success by adding

APP_STL := stlport_static

to their Application.mk file. I have done this as well as tried every other possible value for APP_STL. I’ve cleaned to project, ran ndk-build clean, deleted the obj and libs folders, and still when I compile it cannot find the vector class. I’ve been working on this for a number of weeks now (since NDK r5 came out) and would really appreciate if someone has any advice. Thanks!

Answers:

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-jni
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS    := -llog

include $(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 __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

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

Watch the directories.

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

Questions:
Answers:

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

Questions:
Answers:

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
    }

    ...

}

Questions:
Answers:

Even Sebastian had given a good answer there 3 more years ago, I still would like to share a new experience here, in case you will face same problem as me in new ndk version.

I have compilation error such as:

fatal error: map: No such file or directory
fatal error: vector: No such file or directory

My environment is android-ndk-r9d and adt-bundle-linux-x86_64-20140702.
I add Application.mk file in same jni folder and insert one (and only one) line:

APP_STL                 := stlport_static

But unfortunately, it doesn’t solve my problem!
I have to add these 3 lines into Android.mk to solve it:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

And I saw a good sharing from here that says “‘stlport_shared’ is preferred”. So maybe it’s a better solution to use stlport as a shared library instead of static. Just add the following lines into Android.mk and then no need to add file Application.mk.

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

Hope this is helpful.

Questions:
Answers:

Let me add a little to Sebastian Roth’s answer.

Your project can be compiled by using ndk-build in the command line after adding the code Sebastian had posted. But as for me, there were syntax errors in Eclipse, and I didn’t have code completion.

Note that your project must be converted to a C/C++ project.

How to convert a C/C++ project

To fix this issue right-click on your project, click Properties

Choose C/C++ General -> Paths and Symbols and include the ${ANDROID_NDK}/sources/cxx-stl/stlport/stlport to Include directories

Click Yes when a dialog shows up.

Dialog

Before

Before

After

After

Update #1

GNU C. Add directories, rebuild. There won’t be any errors in C source files
GNU C++. Add directories, rebuild. There won’t be any errors in CPP source files.

Questions:
Answers:

If you are using ndk r10c or later, simply add APP_STL=c++_static to Application.mk

Questions:
Answers:

In android NDK go to
android-ndk-r9b>/sources/cxx-stl/gnu-libstdc++/4.X/include in linux machines

I’ve found solution from the below link
http://osdir.com/ml/android-ndk/2011-09/msg00336.html

Leave a Reply

Your email address will not be published. Required fields are marked *