Most developers writing Android applications will use a high-level object-oriented language such as Java. These languages generate programs that can run on any Android device, but there is some extra processing involved in running them so the overall processing capability is reduced. To maximize processing capability, it is also possible to write native libraries that run directly on the CPU with no overhead. One tradeoff is that a native library will only run on one CPU architecture, so many such libraries may be needed to support all Android devices. Programs written in high-level languages can use native libraries, so an application may be a mix of both. The Android developer tools include a Native Development Kit (NDK) that includes a cross-compiler based on clang. The cross-compiler can be run on the command line, or it can be run as part of the development process using another tool such as Android Studio. The NDK includes Android system files that are needed to build native applications that use the shared libraries (.so files) available on most Android devices, including native audio support and video codecs. Most of the time, the native C code will be compiled to a custom shared library that can be used by a high-level programming language and incorporated into an Android application.