Andorid NDK - C++ trên Android
Bài đăng này đã không được cập nhật trong 8 năm
1. Giới thiệu
Chắc hẳn dev android nào cũng quá quen thuộc hay đã từng nghe quá nhiều về Android NDK hay build C, C++ trên Android
Nhưng không phải ai cũng đã từng sử dụng nó, ngoài ra với đa phần phát triển apps, games trên frameword, lib, trên nền ứng dụng vì thế C, C++ trở nên không cần thiết với trong các ứng dụng đang và đã làm. Nhưng nếu 1 ngày nào đó bạn cần viết 1 thuật toán cần xử lý với tốc độ nhanh, hay viết 1 lib nào đó ở mức bảo mật cao, hoặc mã hoá tất cả dữ liệu vào C, C++ việc làm quen hoặc tìm hiểu về nó có thể sẽ gây mất thời gian cho các bạn
Các định nghĩa, ngôn ngữ hay gặp khi viết C/C++ trên Android
- NDK (Native Development Kit)
- JNI (Java Native Interface)
- Trên window có thể có thêm Cygwin (GNU + Cygnus + Windows)
Bài viết mục đích giới thiệu về NDK, giới thiệu cách build, các thuộc tính và ứng dụng sample "Hello world!"
- Cài đặt NDK
Việc cài đặt NDK trên Eclipse sẽ gặp khá nhiều khó khăn và thời gian, tuy nhiên Android Studio đã ra đời và mang lại cho các bạn mọi tiện ích chỉ bằng 1 cú click
-
Để cài đặt NDK trên Android Studio: Configure -> Project Defaults -> Project Structure
Click vào Download, Android Studio sẽ tự động tải về cho bạn
- Cài đặt NDK trên Eclipse: Tuy Eclipse không phải là IDE phổ biến và thông dụng để code Android ở thời điểm hiện tại, tuy nhiên không phải là không ai sử dụng
Để cài đặt NDK trên Eclipse các bạn có thể tham khảo chi tiết tại đây
- Viết Hello World trên Android NDK
-
Bố cục thư mục
- Tạo thư mục jni - đây là thư mục chứa toàn bộ source native
- Tạo Android.mk - chính là interface để gọi các phương thức hay giao tiếp giữa Java và C, C++
-
Viết chương trình với JNI Như ví dụ dưới đây: Trên lớp Java tạo 1 TextView và settext cho nó là "Hello World!" text này được load lên từ code C++
package com.sample.ndktest;
import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;
public class MainActivity extends Activity {
static {
System.loadLibrary("myjni"); // "myjni.dll" in Windows, "libmyjni.so" in Unixes
}
// A native method that returns a Java String to be displayed on the
// TextView
public native String getMessage();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a TextView.
TextView textView = new TextView(this);
// Retrieve the text from native method getMessage()
textView.setText(getMessage());
setContentView(textView);
}
}
System.loadLibrary(jni_name)
được gọi dữ liệu từ code C/C++ lên thông qua static
, trên window jni được build ra file .dll, còn trên Unix ra file .so
- Tạo file header C/C++ thông qua
javah
Tạo thư mục include
trong thư mục jni của project. Mở terminal và chạy lệnh javah
để tạo file HelloJNI.h
> javah --help
......
// Change directory to <project-root>/jni/include
> javah -classpath ../../bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar
-o HelloJNI.h com.sample.ndktest.MainActivity
Tạo phương thức getMessage trong header
JNIEXPORT jstring JNICALL Java_com_sample_ndktest_MainActivity_getMessage(JNIEnv *, jobject);
- Tạo file .c implements từ file .h
HelloJNI.c
#include <jni.h>
#include "include/HelloJNI.h"
JNIEXPORT jstring JNICALL Java_com_sample_ndktest_MainActivity_getMessage
(JNIEnv *env, jobject thisObj) {
return (*env)->NewStringUTF(env, "Hello World!");
}
JNI cung cấp 1 số kiểu dữ liệu cơ bản giống như java và thêm j
trước
Một số kiểu dữ liệu
- Tạo file Android makefile - Android.mk
Tạo file Android.mk
trong thư mục jni
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myjni
LOCAL_SRC_FILES := HelloJNI.c
include $(BUILD_SHARED_LIBRARY)
- Build file
Với Android Studio tự động build file cho project. Ngoài ra ta có thể tự build file bằng command
// Change to project directory
> ndk-build
Compile thumb : myjni <= HelloJNI.c
SharedLibrary : libmyjni.so
Install : libmyjni.so => libs/armeabi/libmyjni.so
Dưới đây là Project Sample thực hiện các công việc trên Các bạn có thể tải về và xem bố cục của Project cũng nhu tham khảo thêm Demo
All rights reserved