Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android std and stl support

I am playing with android ndk. I am using Window Vista with cygwin (latest version). I compiled and launched the hello world jni sample on my phone. It is working. The code is (is a .cpp file):

#include <string.h>
#include <jni.h>

extern "C" {
JNIEXPORT jstring JNICALL     Java_org_android_helloworld_HelloworldActivity_invokeNativeFunction(JNIEnv* env, jobject     javaThis);
};


jstring Java_org_android_helloworld_HelloworldActivity_invokeNativeFunction(JNIEnv*     env, jobject javaThis)
{
    return  env->NewStringUTF("Hello from native code!");
} 

I wanted to add some modifications, just to play with it a bit:

#include <algorithm>

and then, in the function above, i added:

int a;
a=std::min<int>(10, 5);

but the compiler says that it cannot find the file 'algorithm' and that min() is not part of std.

After a bit of searching, i have found that the android ndk has a gnu-libstdc++ directory with all the std files needed. Reading the NDK docs, i have learned that usint std::* should work without any modification to the code (if one include the proper header files). But it seems that gcc on cygwin is not able to find the needed files.

What are the steps to do in order to be able to use std and stl within a .cpp file in an android ndk app?

like image 650
Luke Avatar asked Sep 07 '11 19:09

Luke


1 Answers

From NDK r5's docs/CPLUSPLUS-SUPPORT.html:

By default, the headers and libraries for the minimal C++ runtime system library (/system/lib/libstdc++.so) are used when building C++ sources.

You can however select a different implementation by setting the variable APP_STL to something else in your Application.mk, for example:

APP_STL := stlport_static

To select the static STLport implementation provided with this NDK. Value APP_STL values are the following:

system -> Use the default minimal C++ runtime library.
stlport_static -> Use STLport built as a static library.
stlport_shared -> Use STLport built as a shared library.
gnustl_static -> Use GNU libstdc++ as a static library.

Which NDK are you using? Have you tried compiling one of the sample applications that utilize the STL such as test-libstdc++?

like image 64
NuSkooler Avatar answered Nov 06 '22 17:11

NuSkooler