+6

Android NDK: Giới thiệu và hướng dẫn sử dụng Kotlin với C/C++

Chào mọi người, bài viết này mình sẽ chia sẻ cách để Kotlin làm việc cùng với Android NDK dành cho những bạn mới bắt đầu. Hãy cùng tìm hiểu nhé!

Android NDK

Native Development Kit (NDK) là một bộ công cụ giúp ta sử dụng code C/C++ trong Android, cung cấp các thư viện giúp chúng ta có thể sử dụng để quản lý các hoạt động của thiết bị, truy nhập vào các bộ phận vật lý của máy như các cảm biến sensors, màn hình cảm ứng, ...

CMake, JNI là gì?

CMake, JNI(Java Native Interface) sẽ xử lý các công việc liên quan đến tương tác giữa native code và Java. Nó là một cầu nối giữa Java, ứng dụng và các thư viện được viết ở các ngôn ngữ khác nhau.

Vì sao ta cần sử dụng NDK?

Thực tế ta đã biết các ngôn ngữ được viết bằng C/C++ có tốc độ chạy rất cao, nhờ đó giúp cho tốc độ của ứng dụng được cải thiện đáng kể. Việc sử dụng NDK giúp cải thiện được hiệu năng của ứng dụng nhờ vào 3 lý do sau:

  1. Navite code được biên dịch trực tiếp ra binary code và chạy trực tiếp trên OS, trong khi đó Java code sẽ được chuyển thành Java byte-code và chạy trên máy ảo Java (JVM)
  2. Native code cho phép developer có thể sử dụng một số các tính năng của bộ xử lý trong khi Android SDK thì không thể
  3. Có thể để cải thiện các đoạn mã ở mức assembly
  4. Rất nhiều các thư viện ví dụ như ffmpeg được viết bằng ngôn ngữ C/C++, và ta có thể sử dụng thư viện này nhờ vào NDK

Bắt đầu nào

Ở bài viết này mình sẽ hướng dẫn các bạn liên kết ứng dụng của mình với NDK sử dụng jni, ở lớp C sẽ viết 1 hàm trả về 1 đoạn string, và ta sẽ gọi hàm đó và lấy ra đoạn string trả về từ lớp Java.

  1. Tạo 1 folder là jni bên trong src/main
  2. Trong folder jni tạo 1 file Android.mk với nội dung như sau:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := keys
LOCAL_SRC_FILES := keys.c

include $(BUILD_SHARED_LIBRARY)
  • LOCAL_MODULE = “keys” là tên bạn muốn sử dụng để truy nhập từ Java code
  • LOCAL_SRC_FILES = “keys.c” là file native code chứa mã nguồn mà bạn sẽ viết.
  1. Tạo file Application.mk bên trong folder jni với nội dung sau:
APP_ABI := all
  1. Tạo C/C++ file "keys.c" trong folder jni với nội dung sau:
#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_hungnt_helloapplication_MainActivity_getStringHello(JNIEnv *env, jobject instance) {

 return (*env)->  NewStringUTF(env, "Hello from nativeLib");
}

Java_com_hungnt_helloapplication_MainActivity_getStringHello Thể hiện đoạn Java code với package name là com.hungnt.helloapplication với Activity là MainActivity là nơi sẽ gọi hàm native này với tên static method là getStringHello

  • Cây thư mục sẽ như sau:
  1. Ở bên trong Activity MainActivity ta sẽ tạo một static block và để load thư viện và declare các vừa viết trong file C/C++
  • Nếu sử dụng Java ta sẽ viết như sau:
 static {
        System.loadLibrary("keys");
    }

    public native String getStringHello();
  • Với Kotlin
  init {
       System.loadLibrary("keys")
   }

   external fun getStringHello(): String
  1. Giờ ta có thể gọi được rồi đó, ví dụ ta sẽ hiển thị ra log:
Log.d("Debug", "Result: " + getStringHello())
  1. Bước cuối cùng, ta cần thêm vào file gradle để có thể build được app qua NDK
android {
    .....
    buildTypes {
        .....
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
}

Giờ ta hãy sync vào build lại project và chạy thử thôi nào, hãy chắc chắn rằng các file của bạn đặt đúng tên là đường dẫn tới NDK là đúng trong module settings nhé! Chúc các bạn thành công!

Tham khảo: https://proandroiddev.com/android-ndk-interaction-of-kotlin-and-c-c-5e19e35bac74


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí