How to create a c++ library with NDK on Android Studio

In this tutorial, you’ll learn how to use Android Studio to start Android NDK project development. You will learn the following:

  • How to use Android Studio to create a native project.
  • How to build and trace native code.

Download the required software packages

Open Android Studio.

Start a new Android Studio project

Start a new Android Studio project

Select Start a new Android Studio project. Enter your custom Application name, Company Domain and select Project location. Click Next.

New Project

New Project

Select Phone and Tablet. Make sure API 15 selected. Click Next.

Configure your new project.

Configure your new project.

Click Next.

Configure your new project

Configure your new project

Select Black Activity and click Next.

Configure your new project

Configure your new project

Click Finish.

Customize the Activity.

Customize the Activity.

Select the menu File > Project Structure > SDK Location and set Android NDK Location.

Project Structure

Project Structure

Add new code inside defaultConfig block.

defaultConfig {
        applicationId "my.intellij.androidrtp"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk {
            moduleName "hello-android-jni"
        }
}

Add JNI function and load jni shared lib into project. Select Android Studio Project pane > app > java > my.intellij.androidrtp > MainActivity, and add JNI function getMsgFromJni() and System.loadLibrary() to the end of class MainActivity.

static {
        System.loadLibrary("hello-android-jni");
    }
    public native String getMsgFromJni();

Configure javah. Select Android Studio > Preferences > Tools > External Tools. Click + symbol.

Create Tool for javah.

Create Tool for javah.

Configure ndk-build.

Create Tool for ndk-build.

Create Tool for ndk-build.

Configure ndk-build clean.

Create Tool for ndk-build clean.

Create Tool for ndk-build clean.

Click Ok.

Preferences.

Preferences.

Configure build.gradle to setup JNI folder location. Open build.gradle file and place this code into android block.

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.0"
    defaultConfig {
        applicationId "my.intellij.androidrtp"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk {
            moduleName "hello-android-jni"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets.main {
        jni.srcDirs = [] 
        jniLibs.srcDirs=['libs']
    }

}

Let’s add one line in ‘gradle.properties’.

android.useDeprecatedNdk=true

Build the project. Select MainActivity, NDK > javah.

NDK javah

NDK javah

Switch to project mode and select NewC/C++ Source File.

C/C++ Source File

C/C++ Source File

Name it as hello-android-jni and click Ok.

Create New C/C++ Source File

Create New C/C++ Source File

Replace with this code in hello-android-jni.cpp.

#include "my_intellij_androidrtp_MainActivity.h"

JNIEXPORT jstring JNICALL Java_my_intellij_androidrtp_MainActivity_getMsgFromJni(JNIEnv *, jobject){

    return (*env)->NewStringUTF(env, "Hello From Jni");
}

Create some MakeFiles. Select jni folder > New > File.

Create some MakeFiles

Create some MakeFiles

Name it as Android.mk. Click Ok.

Create some MakeFiles

Create some MakeFiles

Click Ok.

Register New File Type Association

Register New File Type Association

Repeat same process to create Application.mk file. Replace both files with these codes.

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE		:= hello-android-jni
LOCAL_SRC_FILES		:= hello-android-jni.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_MODULES := hello-android-jni

APP_ABI := all

Build NDK Library. Select jni folder > NDK > ndk-build.

Build NDK Library

Build NDK Library

Success message.

Build NDK Library

Build NDK Library

Replace MainActivity.java with this code.

package my.intellij.androidrtp;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i("MyTag", getMsgFromJni());
    }

    static {
        System.loadLibrary("hello-android-jni");
    }
    public native String getMsgFromJni();
}

Copy all folders that contain .so files in jni folder into jniLibs folder. Build and run.

Output

Output

Output