Why Should You Use Android NDK For Your Upcoming Project?

14 Jun, 2017    Samir Bhatt (Mobile - Android) |  in Mobile


Let’s take a deep dive in NDK in the world of  Android application development. Most of the developers think that NDK is a golden key which can solve any problem that can not be solved using Android SDK. It is not 100 % fact but we must say it is a golden key in some of the case.

There is a certain limitation on development side which we face due to the limitation of java like performance, memory management as we all know Java is borrowed from C language. Even many of controls and basic features are directly drawn. We can overcome these limitations by programming directly into Android native interface using C/C++.

NDK is a native development kit, a set of tools which allow developers to use C / C++ code with Android and provide the readymade library to manage native components of Android.

Let us look main benefits of NDK:

Performance: As we all know, C/C++ have higher performance advantages than Java. That’s reason NDK is golden key when we worked with image processing or higher memory usable task.

Way to integrate C/C++ library: Allow us to integrate C/C++ code in native development.

NDK gives supports where Java API has limitation:

NDK: When we use NDK, It will be more difficult to reverse engineering of compiled machine code than Java bytecode.

NDK allows the developer to use processor related features which are not directly accessible using Android SDK.

That’s why most games and high-performance application always use NDK.

We can directly integrate NDK in Android studio to start development with NDK.

Pre-requisites to set-up NDK in the android studio.

  • Android Studio 2.2
  • Android Native development kit.
  • CMake: CMake is an external build tool that works with Gradle to build with native library.
  • LLDB: LLDB required to debug native code.

Developers can directly install NDK, CMake, and LLDB from Android’s SDK manager.

The user can select Tools -> Android -> SDK Manager to open SDK manager in Android studio.


NDK, CMake, and LLDB will be available in SDK tools tab.

There are some disadvantages of NDK also.

  • Development will take more time compared to simple Java API.
  • Increase the complexity level of application.
  • Debugging is very difficult in NDK. In Java, Exception handling is much easier than NDK.

There are also some limitations on the multiple benefits of NDK. So, developers need to check all feasibility if NDK

will be helpful to them or not in their development.

Let’s try with HELLO WORLD!!!

Let’s take a quick example of NDK with HELLO WORLD project.

Start Android Studio and select Import an Android code sample.

You will have list of code samples. Just search for Hello JNI and click for next option.

You will have an option to update name of application. Update name and click on FINISH.

You will have an option to update the name of an application. Update name and click on FINISH.

Android Studio will build Hello World project.

Following is project structure.

cpp folder is for C/C++ code. User can do their work related to C/C++ in this directory.

Java folder is for Android SDK. The user can directly access methods of C code from cpp directory in java file.

Let’s check how we can access C/C++ code in Android application java file.

Below code snippet is for the Mainactivity.java file of your application.

public class HelloJni extends AppCompatActivity { @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello_jni);
        TextView tv = (TextView)findViewById(R.id.hello_textview);
        tv.setText( stringFromJNI() );
    }
    public native String  stringFromJNI();
 
    public native String  unimplementedStringFromJNI();
 
    /* this is used to load the 'hello-jni' library on application
     * startup. The library has already been unpacked into
     * /data/data/com.example.hellojni/lib/libhello-jni.so at
     * installation time by the package manager.
     */
    static {
        System.loadLibrary("hello-jni");
    }
}

Below code snippet is simple C/C++ code which we can integrate with Android application.

JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
#if defined(__arm__)
    #if defined(__ARM_ARCH_7A__)
    #if defined(__ARM_NEON__)
      #if defined(__ARM_PCS_VFP)
        #define ABI "armeabi-v7a/NEON (hard-float)"
      #else
        #define ABI "armeabi-v7a/NEON"
      #endif
    #else
      #if defined(__ARM_PCS_VFP)
        #define ABI "armeabi-v7a (hard-float)"
      #else
        #define ABI "armeabi-v7a"
      #endif
    #endif
  #else
   #define ABI "armeabi"
  #endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64)  /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif
 
    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");
}

This is a simple demo project which set simple text from C/C++ code to android application but it gives us an idea of how we can actually use C/C++ code in the Android application to boost application performance and go beyond limits.

We can say this is a simple step towards the mountain. Surely we can start with this simple step to more and tougher work using NDK.

I would love to know your opinion on using C/C++ code using Android NDK. Please share your thoughts on this blog.