STLport for Android

WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING

     This feature is currently in beta. In case of issue
     please contact the android-ndk support forum or
     file bugs at http://b.android.com

WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING

This directory contains a port of STLport for Android, which provides
a simple STL implementation. Note that it currently does not support
C++ exceptions and RTTI. Support for wchar_t and locales is probably buggy.

You can either use it as a static or shared library.

1/ The static library is recommended if you will only produce
   one shared library for your project. All necessary STLport functions
   will be added to it. This option should also generate smaller
   overall binaries.

2/ The shared library, is recommended if you want to produce
   several shared libraries in your project, because it avoids copying the
   same STLport functions to each one of them, and having different instances
   of the same global variables (which can easily conflict or result in
   undefined behaviour).

To use the *static* library, define APP_STL in your Application.mk as follows:

    APP_STL := stlport_static

To use the *shared* library, use "stlport_shared" instead:

    APP_STL := stlport_shared

Note that, in this case, you will need, in your application, to explicitely
load the 'stlport_shared' library before any library that depends on it.
For example:

    static {
        System.loadLibrary("stlport_shared");
        System.loadLibrary("foo");
        System.loadLibrary("bar");
    }

If both libfoo.so and libbar.so depend on STLport.

You can build the STLport unit test program by doing the following:

  cd $NDK
  tests/run-tests.sh --test=test-stlport

If you have an Android device connected to your machine, this will
automatically try to run the generated test command. Note that for now
a few tests are still failing (mostly related to wchar_t and locales).

They should be fixed hopefully by a later release of this library.

The NDK comes with prebuilt binaries for this library to speed up development.
You can however rebuild them from sources in your own application build by
defining STLPORT_FORCE_REBUILD to 'true' in your Application.mk as in:

    STLPORT_FORCE_REBUILD := true


VERSION INFORMATION: This module is based on STLport version 5.2.0

