สิ่งที่ควรรู้เกี่ยวกับ Android NDK

ขณะที่ Java เป็นภาษาเริ่มต้นในการเขียน Android มันไม่ใช่วิธีที่ดีที่สุดในการทำ App โดยเฉพาะเกมส์ หลายๆ เครื่องมือที่ใช้สร้างเกมส์ Android ใช้ Android Native Development Kit หรือ ที่เราเรียกกันว่า Android NDK

เพราะ NDK จะทำให้ Developers สามารถเขียน code ในภาษา C หรือ C++ ซึ่งจะถูก compile เป็น Native code ซึ่งหมายความว่า เกมส์ หรือ app ที่ถูกสร้างขึ้นจาก NDK จะสามารถดึง performance ได้มากกว่า นี่คือ guide ในการใช้ Android NDK

Android NDK คืออะไร?

Android Native Development Kit จะทำให้ Developers ได้รับ performance ที่สูงที่สุด สิ่งนี้จะเป็นประโยชน์สำหรับเครื่องมือพัฒนาเกมส์ เช่น Unity หรือ Unreal เพราะ source code จะถูก compile โดยตรงเป็น machine code สำหรับ CPU (ต่างจาก Java ที่จะเป็นภาษากลางก่อน) แล้ว developers จะสามารถได้รับ performance ที่ดีที่สุด ยังมีความเป็นไปได้ที่จะใช้ library อื่นๆ หรือ ของเราเอง ถ้ามีบางสิ่งจำเป็นต้องใช้

มันทำงานอย่างไร

“ndk-build” script คือ หัวใจหลักของ Android NDK และมันมีหน้าที่สำหรับ ค้นหาใน project และ บอกว่าจะ build อะไร โดยอัตโนมัติ

script ยังมีหน้าที่ generate binary และ copy มัน ไปไว้ที่ app project ของเรา

เราสามารถใช้ “native” keyword เพื่อบอก compiler ว่า การ implement ของสิ่งนี้ คือ native

ตัวอย่างคือ

public native int numbers(int x, int y);

ยังมี native shared library (.so) ซึ่ง NDK build จาก native source code และ native static library (.a) ซึ่งสามารถ link ไปที่ library อื่นๆ

Application Binary Interface (ABI) ใช้ file .so เพื่อให้แน่ใจว่า machine code ของ app มันทำงานได้กับระบบ เมื่อ app มีการทำงาน

NDK support ARMABI โดย default กับ MIPS และ x86

ข้อมูลเพิ่มเติมเกี่ยวกับ ABI สามารถอ่านได้ที่นี่

ทุกอย่างจะทำงานภายใต้ interface ก็คือ Java Native Interface ซึ่งก็คือ วิธีที่ Java และ C หรือ C++ คุยกัน ข้อมูลเพิ่มเติมสามารถอ่านได้ที่นี่

ถ้าเราจะ build app โดยใช้ ndk-build script เราจำเป็นต้องสร้าง 2 ไฟล์ Android.mk และ Application.mk

Android.mk จะไปอยู่ใน jni folder และกำหนด module + ชื่อของมัน, bulild flag, library ไหนจะ link และ source file ไหนจะถูก compile

Application.mk จะไปอยู่ใน jni directory ซึ่งมันจะอธิบาย native module ซึ่ง app จำเป็นต้องมี

วิธีการติดตั้ง และ ใช้งาน

การติดตั้ง Android NDK นั้นง่ายมาก เพียงแค่ไปที่ Preferences > Android SDK > Android NDK บน OS X และ File > Settings > Android SDK > SDK Tools > NDK สำหรับบน Windows

เมื่อ Install เสร็จแล้ว เราจำเป็นต้องทำอะไรเพิ่มนิดหน่อย เพื่อให้ app ของเราพร้อมใช้งาน NDK เราจะเริ่มต้นตัวอย่างด้วยการ new application

ในขั้นตอนนี้ เราต้องมี Android Studio 2.2 หรือ สูงกว่า ตรวจสอบว่าเรามี version ล่าสุด แล้วก่อนที่จะทำต่อ

create a new project และเลือก “Basic Activity” จากนั้น click ปุ่ม play เพื่อทำการ run app เพื่อให้แน่ใจว่า app ทำงานได้

เมื่อทุกอย่างถูก set up เราก็ทำให้พร้อมสำหรับ native development

ไปที่ preferences หรือ settings ขึ้นอยู่กับ OS ที่เราใช้ จากนั้นคลิก Build Tools > Gradle และ เลือก “Use default gradle wrapper (recommended)” ถ้ามันไม่ได้ถูกเลือกอยู่แล้ว

หา gradle plugin version ทดลองล่าสุด จากที่นี่ และ จด version ไว้ เปิด project ของเรา ไปที่ build.gradle และแทนที่

classpath ‘com.android.tools.build:gradle:2.1.0’

ด้วย

classpath ‘com.android.tools.build:gradle-experimental:version number

สิ่งนี้จะแทนที่ stable version ของ gradle ด้วย version ทดลองที่ support Android NDK

ไปที่ build.gradle module และแทนที่ code เก่าแบบนี้

apply plugin: 'com.android.model.application'model {
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.example.abutt.aandk"
minSdkVersion.apiLevel 22
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
ndk {
moduleName "hello-android-jni"
}
}
}
// others below this line: no change

Run app และ ตรวจสอบให้แน่ใจว่าทุกอย่างจะทำงาน และ app ทำงานเหมือนตะกี้

ภายใต้ “buildTypes” block ใน build.gradle สำหรับ module เพิ่ม

ndk {
moduleName "hello-android-jni"
}

ใน app ของเรา “MainActivity.java” เพิ่มสิ่งนี้ที่บรรทัดสุดท้าย

// new code
static {
System.loadLibrary("hello-android-jni");
}
public native String getMsgFromJni();
// new code done
} // class MainActivity

Run program และ ตรวจสอบว่าทุกอย่างยังคงทำงานเหมือนที่ควรจะเป็น

ต่อไป คือ การสร้าง C หรือ C++ file

เราควรรับรู้ว่า getMsgFromJni() function เป็นสีแดง เอา mouse ไปวางเหนือ function จนกว่าโคมไฟสีแดงจะ pop up

click โคมไฟ และ click option แรกก็คือ creating a function

C หรือ C++ file จะอยู่ภายใต้ folder ที่เรียกว่า “jni” เปิด file และ วางสิ่งนี้ลงไปบนไฟล์

#include <jni.h>JNIEXPORT jstring JNICALL
Java_com_example_abutt_aandk_MainActivity_getMsgFromJni(JNIEnv *env, jobject instance) {// TODO
return (*env)->NewStringUTF(env, “Hello From Jni! This was done in C!”);
}

ตรวจสอบให้แน่ใจว่า เปลี่ยน “com_example_abutt_aandk” เป็นชื่อ app ของเรา

สิ่งนี้จะถูกอ่านโดย getMsgFromJni() function เพื่อแสดงข้อความ “Hello From Jni! This was done C!”.

ไปที่ app “MainActivtiy” และ เพิ่มส่งนี้ไปที่บรรทัดสุดท้ายของ OnCreate() method

((TextView) findViewById(R.id.jni_msgView)).setText(getMsgFromJni());

โอเค app ของเราควรจะทำงานถูกต้อง และใช้ประโยชน์จาก Android NDK!

นี่ไม่ใช่ตัวอย่างในชีวิตจริง ว่า NDK จะถูกใช้อย่างไร

ตัวอย่างในชีวิตจริง จะถูกพัฒนาสำหรับ OpenGL และ Vulkan หรือ ใช้เครื่องมือเช่น Unity หรือ Unreal ซึ่งมี NDK

สรุป

Android NDK ใช้สำหรับงานที่เฉพาะ และอาจจะไม่เหมาะสำหรับงานทั่วๆไป แต่ NDK ได้ให้ผู้สร้างเครื่องมือสำหรับวิธีที่ดีในการ optimize product ของเขา สำหรับความสามารถทาง graphics ที่ดี และใช้ resources น้อย

การสร้าง Application ง่ายๆ โดยใช้ Android NDK ไม่ยากเกินไป และ ฝึกกับ native OpenGL ก็เป็นไปได้

Credit : http://www.androidauthority.com/android-ndk-everything-need-know-677642/