1 page.title=C++ Library Support 2 @jd:body 3 4 <div id="qv-wrapper"> 5 <div id="qv"> 6 <h2>On this page</h2> 7 8 <ol> 9 <li><a href="#hr">Helper Runtimes</a></li> 10 <li><a href="#rc">Runtime Characteristics</a></li> 11 <li><a href="#ic">Important Considerations</a></li> 12 <li><a href="#li">Licensing</a></li> 13 </ol> 14 </div> 15 </div> 16 17 <p>The Android platform provides a very minimal C++ runtime support library ({@code libstdc++}). 18 This minimal support does not include, for example:</p> 19 20 <ul> 21 <li>Standard C++ Library support (except a few trivial headers).</li> 22 <li>C++ exceptions support</li> 23 <li>RTTI support</li> 24 </ul> 25 26 <p>The NDK provides headers for use with this default library. In addition, the NDK provides a 27 number of helper runtimes that provide additional features. This page provides information about 28 these helper runtimes, their characteristics, and how to use them. 29 </p> 30 31 <h2 id="hr">Helper Runtimes</h2> 32 33 <p>Table 1 provides names, brief explanations, and features of runtimes available inthe NDK.</p> 34 35 <p class="table-caption" id="runtimes"> 36 <strong>Table 1.</strong> NDK Runtimes and Features.</p> 37 38 <table> 39 <tr> 40 <th>Name</th> 41 <th>Explanation> 42 <th>Features 43 </tr> 44 45 <tr> 46 <td><a href="#system">{@code libstdc++} (default)</a> </td> 47 <td>The default minimal system C++ runtime library.</td> 48 <td>N/A</td> 49 </tr> 50 51 <tr> 52 <td><a href="#ga">{@code gabi++_static}</a> </td> 53 <td>The GAbi++ runtime (static).</td> 54 <td>C++ Exceptions and RTTI</td> 55 </tr> 56 57 <tr> 58 <td><a href="#ga">{@code gabi++_shared}</a> </td> 59 <td>The GAbi++ runtime (shared).</td> 60 <td>C++ Exceptions and RTTI</td> 61 </tr> 62 63 <tr> 64 <td><a href="#stl">{@code stlport_static}</a> </td> 65 <td>The STLport runtime (static).</td> 66 <td> C++ Exceptions and RTTI; Standard Library</td> 67 </tr> 68 69 <tr> 70 <td><a href="#stl">{@code stlport_shared}</a> </td> 71 <td>The STLport runtime (shared).</td> 72 <td> C++ Exceptions and RTTI; Standard Library</td> 73 </tr> 74 75 <tr> 76 <td><a href="#gn">{@code gnustl_static}</a> </td> 77 <td>The GNU STL (static).</td> 78 <td> C++ Exceptions and RTTI; Standard Library</td> 79 </tr> 80 81 <tr> 82 <td><a href="#gn">{@code gnustl_shared}</a> </td> 83 <td>The GNU STL (shared).</td> 84 <td> C++ Exceptions and RTTI; Standard Library</td> 85 </tr> 86 87 <tr> 88 <td><a href="#cs">{@code c++_static}</a> </td> 89 <td>The LLVM libc++ runtime (static).</td> 90 <td> C++ Exceptions and RTTI; Standard Library</td> 91 </tr> 92 93 <tr> 94 <td><a href="#cs">{@code c++_shared}</a> </td> 95 <td>The LLVM libc++ runtime (shared).</td> 96 <td> C++ Exceptions and RTTI; Standard Library</td> 97 </tr> 98 </table> 99 100 <h3>How to set your runtime</h3> 101 102 <p>Use the {@code APP_STL} variable in your <a href="{@docRoot}ndk/guides/application_mk.html"> 103 {@code Application.mk}</a> file to specify the runtime you wish to use. Use the values in 104 the "Name" column in Table 1 as your setting. For example:</p> 105 106 <pre> 107 APP_STL := gnustl_static 108 </pre> 109 110 <p>You may only select one runtime for your app, and can only do in 111 <a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a>.</p> 112 113 <p>Even if you do not use the NDK build system, you can still use STLport, libc++ or GNU STL. 114 For more information on how to use these runtimes with your own toolchain, see <a href="{@docRoot}ndk/guides/standalone_toolchain.html">Standalone Toolchain</a>.</p> 115 116 <h2 id="rc">Runtime Characteristics</h2> 117 <h3 id="system">libstdc++ (default system runtime)</h3> 118 119 <p>This runtime only provides the following headers, with no support beyond them:</p> 120 <ul> 121 <li>{@code cassert}</li> 122 <li>{@code cctype}</li> 123 <li>{@code cerrno}</li> 124 <li>{@code cfloat}</li> 125 <li>{@code climits}</li> 126 <li>{@code cmath}</li> 127 <li>{@code csetjmp}</li> 128 <li>{@code csignal}</li> 129 <li>{@code cstddef}</li> 130 <li>{@code cstdint}</li> 131 <li>{@code cstdio}</li> 132 <li>{@code cstdlib}</li> 133 <li>{@code cstring}</li> 134 <li>{@code ctime}</li> 135 <li>{@code cwchar}</li> 136 <li>{@code new}</li> 137 <li>{@code stl_pair.h}</li> 138 <li>{@code typeinfo}</li> 139 <li>{@code utility}</li> 140 </ul> 141 142 <h3 id="ga">GAbi++ runtime</h3> 143 <p>This runtime provides the same headers as the default runtime, but adds support for RTTI 144 (RunTime Type Information) and exception handling.</p> 145 146 147 <h3 id="stl">STLport runtime</h3> 148 <p>This runtime is an Android port of STLport 149 (<a href="http://www.stlport.org">http://www.stlport.org</a>). It provides a complete set of C++ 150 standard library headers. It also, by embedding its own instance of GAbi++, provides support for 151 RTTI and exception handling.</p> 152 153 <p>While shared and static versions of this runtime are avilable, we recommend using the shared 154 version. For more information, see <a href="#sr">Static runtimes</a>.</p> 155 156 <p>The shared library file is named {@code libstlport_shared.so} instead of {@code libstdc++.so} 157 as is common on other platforms.</p> 158 159 <p>In addition to the static- and shared-library options, you can also force the NDK to 160 build the library from sources by adding the following line to your {@code Application.mk} 161 file, or setting it in your environment prior to building: </p> 162 163 <pre> 164 STLPORT_FORCE_REBUILD := true 165 </pre> 166 167 168 <h3 id="gn">GNU STL runtime</h3> 169 <p>This runtime is the GNU Standard C++ Library, ({@code libstdc++-v3}). Its shared library file is 170 named {@code libgnustl_shared.so}.</p> 171 172 173 <h3 id="cs">libc++ runtime:</h3> 174 <p>This runtime is an Android port of <a href="http://libcxx.llvm.org/">LLVM libc++</a>. Its 175 shared library file is named {@code libc++_shared.so}.</p> 176 177 <p>By default, this runtime compiles with {@code -std=c++11}. As with GNU {@code libstdc++}, you 178 need to explicitly turn on exceptions or RTTI support. For information on how to do this, see 179 <a href="#xp">C++ Exceptions</a> and <a href="#rt">RTTI</a>.</p> 180 181 <p>The NDK provides prebuilt static and shared libraries for {@code libc++}, but you can force the 182 NDK to rebuild {@code libc++} from sources by adding the following line to your 183 {@code Application.mk} file, or setting it in your environment prior to building: </p> 184 185 <pre> 186 LIBCXX_FORCE_REBUILD := true 187 </pre> 188 189 <h4>Atomic support</h4> 190 191 <p>If you include {@code <atomic>}, it's likely that you also need {@code libatomic}. 192 If you are using {@code ndk-build}, add the following line:</p> 193 194 <pre> 195 LOCAL_LDLIBS += -latomic 196 </pre> 197 198 <p>If you are using your own toolchain, use:</p> 199 200 <pre> 201 -latomic 202 </pre> 203 204 205 <h4>Compatibility</h4> 206 207 <p>The NDK's libc++ is not stable. Not all the tests pass, and the test suite is not comprehensive. 208 Some known issues are:</p> 209 210 <ul> 211 <li>Using {@code c++_shared} on ARM can crash when an exception is thrown.</li> 212 <li>Support for {@code wchar_t} and the locale APIs is limited.</li> 213 </ul> 214 215 <p>You should also make sure to check the "Known Issues" section of the changelog for the NDK 216 release you are using.</p> 217 218 <p class="note"><strong>Warning: </strong>Attempting to change to an unsupported locale will 219 <strong>not</strong> fail. The operation will succeed, but the locale will not change and the 220 following message will appear in {@code logcat}.</p> 221 222 <pre> 223 newlocale() WARNING: Trying to set locale to en_US.UTF-8 other than "", "C" or "POSIX" 224 </pre> 225 226 227 <h2 id="ic">Important Considerations</h2> 228 229 <h3 id="xp">C++ Exceptions</h3> 230 <p>In all versions of the NDK later than NDKr5, the NDK toolchain allows you to use C++ runtimes 231 that support exception handling. However, to ensure compatibility with earlier releases, it 232 compiles all C++ sources with {@code -fno-exceptions} support by default. You can enable C++ 233 exceptions either for your entire app, or for individual modules. 234 235 <p>To enable exception-handling support for your entire app, add the following line to 236 your <a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file. 237 To enable exception-handling support for individual modules', add the following line to 238 their respective <a href="{@docRoot}ndk/guides/android_mk.html">{@code Android.mk}</a> files.</p> 239 240 <pre> 241 APP_CPPFLAGS += -fexceptions 242 </pre> 243 244 <h3 id="rt">RTTI</h3> 245 <p>In all versions of the NDK later than NDKr5, the NDK toolchain allows you to use C++ runtimes 246 that support RTTI. However, to ensure compatibility with earlier releases, it compiles all C++ 247 sources with {@code -fno-rtti} by default. 248 249 <p>To enable RTTI support for your entire app for your entire application, add the following line to 250 your <a href="{@docRoot}ndk/guides/application_mk.html">{@code Application.mk}</a> file: 251 252 <pre> 253 APP_CPPFLAGS += -frtti 254 </pre> 255 256 To enable RTTI support for individual modules, add the following line to 257 their respective <a href="{@docRoot}ndk/guides/android_mk.html">{@code Android.mk}</a> files: 258 259 <pre> 260 LOCAL_CPP_FEATURES += rtti 261 </pre> 262 263 Alternatively, you can use: 264 265 <pre> 266 LOCAL_CPPFLAGS += -frtti 267 </pre> 268 269 <h3 id="sr">Static runtimes</h3> 270 <p>Linking the static library variant of a C++ runtime to more than one binary may result in 271 unexpected behavior. For example, you may experience:</p> 272 273 <ul> 274 <li>Memory allocated in one library, and freed in the other, causing memory leakage or heap 275 corruption.</li> 276 <li>Exceptions raised in {@code libfoo.so} going uncaught in {@code libbar.so}, causing your app 277 to crash.</li> 278 <li>Buffering of {@code std::cout} not working properly</li> 279 </ul> 280 281 <p>In addition, if you link two shared libraries–or a shared library and an executable– 282 against the same static runtime, the final binary image of each shared library includes a copy of 283 the runtime's code. Having multiple instances of runtime code is problematic because of duplication 284 of certain global variables that the runtime uses or provides internally.</p> 285 286 <p>This problem does not apply to a project comprising a single shared library. For example, 287 you can link against {@code stlport_static}, and expect your app to behave correctly. If your 288 project requires several shared library modules, we recommend that you use the shared library 289 variant of your C++ runtime.</p> 290 291 <h3>Shared runtimes</h3> 292 <p>If your app targets a version of Android earlier than Android 4.3 (Android API level 18), 293 and you use the shared library variant of a given C++ runtime, you must load the shared library 294 before any other library that depends on it.</p> 295 296 <p>For example, an app may have the following modules:</p> 297 298 <ul> 299 <li>libfoo.so</li> 300 <li>libbar.so which is used by libfoo.so</li> 301 <li>libstlport_shared.so, used by both libfoo and libbar</li> 302 </ul> 303 304 <p>You must load the libraries in reverse dependency order: </p> 305 <pre> 306 static { 307 System.loadLibrary("stlport_shared"); 308 System.loadLibrary("bar"); 309 System.loadLibrary("foo"); 310 } 311 </pre> 312 313 <p class="note"><strong>Note: </strong>Do not use the {@code lib} prefix when calling 314 {@code System.loadLibrary()}.</p> 315 316 <h2 id="li">Licensing</h2> 317 318 <p>STLport is licensed under a BSD-style open-source license. See 319 {@code $NDK/sources/cxx-stl/stlport/README} for more details about STLport.</p> 320 321 <p>GNU libstdc++ is covered by the GPLv3 license, and <em>not</em> the LGPLv2 or LGPLv3. For 322 more information, see <a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html"> 323 License</a> on the GCC website.</p> 324 325 <p><a href="https://llvm.org/svn/llvm-project/libcxx/trunk/LICENSE.TXT">LLVM {@code libc++}</a> 326 is dual-licensed under both the University of Illinois "BSD-Like" license and the MIT license.</p> 327