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é!
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, …
[external_link_head]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.
[external_link offset=1]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:
- 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)
- 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ể
- Có thể để cải thiện các đoạn mã ở mức assembly
- 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à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.
- Tạo 1 folder là
jni
bên trongsrc/main
- Trong folder
jni
tạo 1 fileAndroid.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 codeLOCAL_SRC_FILES = “keys.c”
là file native code chứa mã nguồn mà bạn sẽ viết.
- Tạo file
Application.mk
bên trong folderjni
với nội dung sau:
APP_ABI := all
- 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:
- Ở 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
- Giờ ta có thể gọi được rồi đó, ví dụ ta sẽ hiển thị ra log:
Log.d("Debug", "Result: " + getStringHello())
- 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 [external_footer]