## 3.3\. Native API Compatibility Native code compatibility is challenging. For this reason, device implementers are: * [SR] STRONGLY RECOMMENDED to use the implementations of the libraries listed below from the upstream Android Open Source Project. ### 3.3.1\. Application Binary Interfaces Managed Dalvik bytecode can call into native code provided in the application `.apk` file as an ELF `.so` file compiled for the appropriate device hardware architecture. As native code is highly dependent on the underlying processor technology, Android defines a number of Application Binary Interfaces (ABIs) in the Android NDK. Device implementations: * [C-0-1] MUST be compatible with one or more defined [Android NDK ABIs]( https://developer.android.com/ndk/guides/abis). * [C-0-2] MUST include support for code running in the managed environment to call into native code, using the standard Java Native Interface (JNI) semantics. * [C-0-3] MUST be source-compatible (i.e. header-compatible) and binary-compatible (for the ABI) with each required library in the list below. * [C-0-5] MUST accurately report the native Application Binary Interface (ABI) supported by the device, via the `android.os.Build.SUPPORTED_ABIS`, `android.os.Build.SUPPORTED_32_BIT_ABIS`, and `android.os.Build.SUPPORTED_64_BIT_ABIS` parameters, each a comma separated list of ABIs ordered from the most to the least preferred one. * [C-0-6] MUST report, via the above parameters, a subset of the following list of ABIs and MUST NOT report any ABI not on the list. * `armeabi` (no longer supported as a target by the NDK) * [`armeabi-v7a`](https://developer.android.com/ndk/guides/abis#v7a) * [`arm64-v8a`](https://developer.android.com/ndk/guides/abis#arm64-v8a) * [`x86`](https://developer.android.com/ndk/guides/abis#x86) * [`x86-64`](https://developer.android.com/ndk/guides/abis#86-64) * [C-0-7] MUST make all the following libraries, providing native APIs, available to apps that include native code: * libaaudio.so (AAudio native audio support) * libamidi.so (native MIDI support, if feature `android.software.midi` is claimed as described in Section 5.9) * libandroid.so (native Android activity support) * libc (C library) * libcamera2ndk.so * libdl (dynamic linker) * libEGL.so (native OpenGL surface management) * libGLESv1\_CM.so (OpenGL ES 1.x) * libGLESv2.so (OpenGL ES 2.0) * libGLESv3.so (OpenGL ES 3.x) * libicui18n.so * libicuuc.so * libjnigraphics.so * liblog (Android logging) * libmediandk.so (native media APIs support) * libm (math library) * libneuralnetworks.so (Neural Networks API) * libOpenMAXAL.so (OpenMAX AL 1.0.1 support) * libOpenSLES.so (OpenSL ES 1.0.1 audio support) * libRS.so * libstdc++ (Minimal support for C++) * libvulkan.so (Vulkan) * libz (Zlib compression) * JNI interface * [C-0-8] MUST NOT add or remove the public functions for the native libraries listed above. * [C-0-9] MUST list additional non-AOSP libraries exposed directly to third-party apps in `/vendor/etc/public.libraries.txt`. * [C-0-10] MUST NOT expose any other native libraries, implemented and provided in AOSP as system libraries, to third-party apps targeting API level 24 or higher as they are reserved. * [C-0-11] MUST export all the OpenGL ES 3.1 and [Android Extension Pack]( http://developer.android.com/guide/topics/graphics/opengl.html#aep) function symbols, as defined in the NDK, through the `libGLESv3.so` library. Note that while all the symbols MUST be present, section 7.1.4.1 describes in more detail the requirements for when the full implementation of each corresponding functions are expected. * [C-0-12] MUST export function symbols for the core Vulkan 1.0 function symbols, as well as the `VK_KHR_surface`, `VK_KHR_android_surface`, `VK_KHR_swapchain`, `VK_KHR_maintenance1`, and `VK_KHR_get_physical_device_properties2` extensions through the `libvulkan.so` library. Note that while all the symbols MUST be present, section 7.1.4.2 describes in more detail the requirements for when the full implementation of each corresponding functions are expected. * SHOULD be built using the source code and header files available in the upstream Android Open Source Project Note that future releases of Android may introduce support for additional ABIs. ### 3.3.2. 32-bit ARM Native Code Compatibility If device implementations report the support of the `armeabi` ABI, they: * [C-3-1] MUST also support `armeabi-v7a` and report its support, as `armeabi` is only for backwards compatibility with older apps. If device implementations report the support of the `armeabi-v7a` ABI, for apps using this ABI, they: * [C-2-1] MUST include the following lines in `/proc/cpuinfo`, and SHOULD NOT alter the values on the same device, even when they are read by other ABIs. * `Features: `, followed by a list of any optional ARMv7 CPU features supported by the device. * `CPU architecture: `, followed by an integer describing the device's highest supported ARM architecture (e.g., "8" for ARMv8 devices). * [C-2-2] MUST always keep the following operations available, even in the case where the ABI is implemented on an ARMv8 architecture, either through native CPU support or through software emulation: * SWP and SWPB instructions. * SETEND instruction. * CP15ISB, CP15DSB, and CP15DMB barrier operations. * [C-2-3] MUST include support for the [Advanced SIMD]( http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388f/Beijfcja.html) (a.k.a. NEON) extension.