Home | History | Annotate | Download | only in docs
      1 Android NDK Stable APIs:
      2 ========================
      3 
      4 This is the list of stable APIs/ABIs exposed by the Android NDK.
      5 
      6 I. Purpose:
      7 -----------
      8 
      9 Each API corresponds to a set of headers files, and a shared library file
     10 that contains the corresponding implementation, and which must be linked
     11 against by your native code.
     12 
     13 For example, to use system library "Foo", you would include a header
     14 like <foo.h> in your code, then tell the build system that your native
     15 module needs to link to /system/lib/libfoo.so at load-time by adding
     16 the following line to your Android.mk file:
     17 
     18   LOCAL_LDLIBS := -lfoo
     19 
     20 Note that the build system automatically links the C library, the Math
     21 library and the C++ support library to your native code, there is no
     22 need to list them in a LOCAL_LDLIBS line.
     23 
     24 There are several "API Levels" defined. Each API level corresponds to
     25 a given Android system platform release. The following levels are
     26 currently supported:
     27 
     28     android-3      -> Official Android 1.5 system images
     29     android-4      -> Official Android 1.6 system images
     30     android-5      -> Official Android 2.0 system images
     31     android-6      -> Official Android 2.0.1 system images
     32     android-7      -> Official Android 2.1 system images
     33     android-8      -> Official Android 2.2 system images
     34 
     35 Note that android-6 and android-7 are the same than android-5 for the NDK,
     36 i.e. they provide exactly the same native ABIs!
     37 
     38 II. Android-3 Stable Native APIs:
     39 ---------------------------------
     40 
     41 All the APIs listed below are available for developing native code that
     42 runs on Android 1.5 system images and above.
     43 
     44 The C Library:
     45 --------------
     46 
     47 The C library headers, as they are defined on Android 1.5 are available
     48 through their standard names (<stdlib.h>, <stdio.h>, etc...). If one header
     49 is not there at build time, it's because its implementation is not available
     50 on a 1.5 system image.
     51 
     52 The build system automatically links your native modules to the C library,
     53 you don't need to add it to LOCAL_LDLIBS.
     54 
     55 Note that the Android C library includes support for pthread (<pthread.h>),
     56 so "LOCAL_LIBS := -lpthread" is not needed. The same is true for real-time
     57 extensions (-lrt on typical Linux distributions).
     58 
     59 
     60 ** VERY IMPORTANT NOTE: ******************************************************
     61 *
     62 *  The kernel-specific headers in <linux/...> and <asm/...> are not considered
     63 *  stable at this point. Avoid including them directly because some of them
     64 *  are likely to change in future releases of the platform. This is especially
     65 *  true for anything related to specific hardware definitions.
     66 *
     67 ******************************************************************************
     68 
     69 
     70 The Math Library:
     71 -----------------
     72 
     73 <math.h> is available, and the math library is automatically linked to your
     74 native modules at build time, so there is no need to list "-lm" through
     75 LOCAL_LDLIBS.
     76 
     77 
     78 
     79 C++ Library:
     80 ------------
     81 
     82 An *extremely* minimal C++ support API is available. For Android 1.5, this is
     83 currently limited to the following headers:
     84 
     85    <cstddef>
     86    <new>
     87    <utility>
     88    <stl_pair.h>
     89 
     90 They may not contain all definitions required by the standard. Notably,
     91 support for C++ exceptions and RTTI is not available with Android 1.5 system
     92 images.
     93 
     94 The C++ support library (-lstdc++) is automatically linked to your native
     95 modules too, so there is no need to list it through LOCAL_LDLIBS
     96 
     97 
     98 
     99 Android-specific Log Support:
    100 -----------------------------
    101 
    102 <android/log.h> contains various definitions that can be used to send log
    103 messages to the kernel from your native code. Please have a look at its
    104 content in (build/platforms/android-3/common/include/android/log.h), which
    105 contain many informative comments on how to use it.
    106 
    107 You should be able to write helpful wrapper macros for your own usage to
    108 access this facility.
    109 
    110 If you use it, your native module should link to /system/lib/liblog.so with:
    111 
    112   LOCAL_LDLIBS := -llog
    113 
    114 
    115 ZLib Compression Library:
    116 -------------------------
    117 
    118 <zlib.h> and <zconf.h> are available and can be used to use the ZLib
    119 compression library. Documentation for it is at the ZLib page:
    120 
    121     http://www.zlib.net/manual.html
    122 
    123 If you use it, your native module should link to /system/lib/libz.so with:
    124 
    125   LOCAL_LDLIBS := -lz
    126 
    127 
    128 Dynamic Linker Library:
    129 -----------------------
    130 
    131 <dlfcn.h> is available and can be used to use the dlopen()/dlsym()/dlclose()
    132 functions provided by the Android dynamic linker. You will need to link
    133 against /system/lib/libdl.so with:
    134 
    135   LOCAL_LDLIBS := -ldl
    136 
    137 
    138 III. Android-4 Stable Native APIs:
    139 ----------------------------------
    140 
    141 All the APIs listed below are available for developing native code that runs
    142 on Android 1.6 system images and above,
    143 
    144 
    145 The OpenGL ES 1.x Library:
    146 --------------------------
    147 
    148 The standard OpenGL ES headers <GLES/gl.h> and <GLES/glext.h> contain the
    149 declarations needed to perform OpenGL ES 1.x rendering calls from native
    150 code.
    151 
    152 If you use them, your native module should link to /system/lib/libGLESv1_CM.so
    153 as in:
    154 
    155   LOCAL_LDLIBS := -lGLESv1_CM.so
    156 
    157 
    158 The '1.x' here refers to both versions 1.0 and 1.1 of the OpenGL ES APIs.
    159 Please note that:
    160 
    161   - OpenGL ES 1.0 is supported on *all* Android-based devices.
    162   - OpenGL ES 1.1 is fully supported only on specific devices that
    163     have the corresponding GPU.
    164 
    165 This is because Android comes with a 1.0-capable software renderer that can
    166 be used on GPU-less devices.
    167 
    168 Developers should query the OpenGL ES version string and extension string
    169 to know if the current device supports the features they need. See the
    170 description of glGetString() in the specification to see how to do that:
    171 
    172     http://www.khronos.org/opengles/sdk/1.1/docs/man/glGetString.xml
    173 
    174 Additionally, developers must put a <uses-feature> tag in their manifest
    175 file to indicate which version of OpenGL ES their application requires. See
    176 the documentation linked below for details:
    177 
    178  http://developer.android.com/guide/topics/manifest/uses-feature-element.html
    179 
    180 Please note that, at the moment, native headers and libraries for the EGL APIs
    181 are *not* available. EGL is used to perform surface creation and flipping
    182 (instead of rendering). The corresponding operations must be performed in your
    183 VM application instead, for example with a GLSurfaceView, as described here:
    184 
    185 http://android-developers.blogspot.com/2009/04/introducing-glsurfaceview.html
    186 
    187 The "san-angeles" sample application shows how you can do that, while
    188 rendering each frame in native code. This is a small Android port of the
    189 excellent "San Angeles Observation" demo program. For more information about
    190 it, see:
    191 
    192     http://jet.ro/visuals/san-angeles-observation/
    193 
    194 
    195 IV. Android-5 Stable Native APIs:
    196 ----------------------------------
    197 
    198 All the APIs listed below are available for developing native code that runs
    199 on Android 2.0 system images and above.
    200 
    201 
    202 The OpenGL ES 2.0 Library:
    203 --------------------------
    204 
    205 The standard OpenGL ES 2.0 headers <GLES2/gl2.h> and <GLES2/gl2ext.h> contain the
    206 declarations needed to perform OpenGL ES 2.0 rendering calls from native code.
    207 This includes the ability to define and use vertex and fragment shaders using the
    208 GLSL language.
    209 
    210 If you use them, your native module should link to /system/lib/libGLESv2.so
    211 as in:
    212 
    213   LOCAL_LDLIBS := -lGLESv2.so
    214 
    215 Not all devices support OpenGL ES 2.0, developers should thus query the
    216 implementation's version and extension strings, and put a <uses-feature>
    217 tag in their Android manifest. See Section III above for details.
    218 
    219 Please note that, at the moment, native headers and libraries for the EGL APIs
    220 are *not* available. EGL is used to perform surface creation and flipping
    221 (instead of rendering). The corresponding operations must be performed in your
    222 VM application instead, for example with a GLSurfaceView, as described here:
    223 
    224 http://android-developers.blogspot.com/2009/04/introducing-glsurfaceview.html
    225 
    226 The "hello-gl2" sample application demonstrate this. It is used to draw a very
    227 simple triangle with the help of a vertex and fragment shaders.
    228 
    229 IMPORTANT NOTE:
    230     The Android emulator does not support OpenGL ES 2.0 hardware emulation
    231     at this time. Running and testing code that uses this API requires a
    232     real device with such capabilities.
    233 
    234 
    235 IV. Android-8 Stable Native APIs:
    236 ----------------------------------
    237 
    238 All the APIs listed below are available for developing native code that runs
    239 on Android 2.2 system images and above.
    240 
    241 
    242 The 'jnigraphics' Library:
    243 --------------------------
    244 
    245 This is a tiny library that exposes a stable, C-based, interface that allows
    246 native code to reliably access the pixel buffers of Java bitmap objects.
    247 
    248 To use it, include the <android/bitmap.h> header in your source code, and
    249 and link to the jnigraphics library as in:
    250 
    251   LOCAL_LDLIBS += -ljnigraphics
    252 
    253 For details, read the source header at the following location:
    254 
    255     build/platforms/android-8/arch-arm/usr/include/android/bitmap.h
    256 
    257 Briefly, typical usage should look like:
    258 
    259     1/ Use AndroidBitmap_getInfo() to retrieve information about a
    260        given bitmap handle from JNI (e.g. its width/height/pixel format)
    261 
    262     2/ Use AndroidBitmap_lockPixels() to lock the pixel buffer and
    263        retrieve a pointer to it. This ensures the pixels will not move
    264        until AndroidBitmap_unlockPixels() is called.
    265 
    266     3/ Modify the pixel buffer, according to its pixel format, width,
    267        stride, etc.., in native code.
    268 
    269     4/ Call AndroidBitmap_unlockPixels() to unlock the buffer.
    270