Mobil Informatikai Rendszerek Android NDK – Native Development Kit
2016. november 27.
Sicz-Mesziár János sicz- m e sziar.janos @ nik. u ni - ob u d a.h u
NDK – Native Development Kit Egy „set of tools”, amely lehetővé teszi, hogy C ill. C++ kódot futtassunk az Android alkalmazásunk alatt. A platform library felhasználásával native Activity-ket hozhatunk létre, illetve hozzáférhetünk olyan fizikai erőforrásokhoz is mint például érzékelők, touch screen, stb... Két fontosabb esetben szoktak natív kódot alkalmazni:
Nagy teljesítmény igényű alkalmazások, pl játékok és fizikai szimulációk
Meglévő kód-könyvtárak újrafelhasználása, közös platform kódok
Támogatottság:
Android Studio 2.2+, Gradle
JNI (Java Native Interface) kommunikáció
Cmake, ndk-build Sicz-Mesziár János
11/27/2016
2
Fejlesztő környezet Natív kódok fordításához az alábbiak szükségesek:
NDK letöltése:
1.
https://developer.android.com/ndk/downloads/index.html 2.
CMake: egy külső build eszköz ami a Gradle-el használható
3.
LLDB: natív kód hibakereséséhez
vagy a fentiek letölthetőek SDK Manager használatával:
1.
Tools > Android > SDK Manager
2.
SDK Tools tab
3.
LLDB, CMake, és NDK kiválasztása
Sicz-Mesziár János
11/27/2016
3
NDK Fogalmak ndk-build: Automatikus forrás fájl összegyűjtés Bináris fájlok létrehozása a forráskód alapján (*.so) Bináris fájlok bemásolása a projektbe Java: native kulcsszó használata public native int add(int
x, int
y);
Native shared libraries: lefordított *.so fájlok Native static libraries: tud statikus library-vel dolgozni, vagy más library *.a fájlokat linkelni Java Native Interface (JNI): Java és C++ komponensek adatot cserélnek Application Binary Interface (ABI): meghatározza, hogy a gépi kód miként kerül interakcióval a rendszerrel futás időben Manifest: ha nincs Java kód az alkalmazásunkban (tisztán Cben írt alkalmazás), akkor itt kell NativeActivity-t deklarálni. Sicz-Mesziár János
11/27/2016
4
NDK Build ANDROID.MK Létre kell hozni egy Android.mk konfigurációs fájlt a jni/ könyvtárban. Az ndk-build ezt a fájlt figyeli:
Definiálja a modulokat és neveiket
Fordítandó forrásfájlokat
Build flageket
Linkelt library-ket
… bővebben itt APPLICATION.MK
Az alkalmazás által megkövetelt modulok. Az alábbiakat tartalmazza:
Egyes platformok ABI verziói
Toolchain
Standard libraries
… bővebben itt Sicz-Mesziár János
11/27/2016
5
NDK Build flow 1.
Eldönteni alkalmazásunk mely része lesz natív kódban. (UI-t és képernyő kezelést érdemes Java oldalon hagyni)
2.
Új Android projekt létrehozása a szokott módon
3.
Ha native-only app, akkor NativeActivity deklarálása a AndroidManifest.xml fájlban.
4.
Android.mk fájl létrehozása az /app/src/main/jni könyvtárban. (name, flags, linked libraries)
5.
Application.mk fájl létrehozása (opcionális) (target ABIs, toolchain, release/debug mode, and STL)
6.
ndk-build paranccsal natív kód fordítása (*.a, *.so fájlok létrehozása)
7.
Java kód fordítása (*.dex fájl létrehozása)
8.
Csomag összeállítása (*.apk fájl létrehozása)
Sicz-Mesziár János
11/27/2016
6
NDK a gyakorlatban 1.
NDK csomag letöltése, majd kicsomagolása (pl android-ndk-r11c)
2.
Új Android projekt létrehozása
3.
Natív kódhívást tartalmazó Java osztály megírása: public class AwesomeLogic { public static native String getLogicVersionName(); }
4.
Hozzá tartozó C/C++ header fájl generálása a JNI könyvtárba: hu_uniobuda_nik_nativeapplication_AwesomeLogic.h "%JAVA_HOME%\bin\javah" -jni -d ..\app\src\main\jni\ -classpath c:\android-sdk-windows\platforms\android23\android.jar;..\app\build\intermediates\classes\debug hu.uniobuda.nik.nativeapplication.AwesomeLogic
5.
C/C++ kód megírása JNIEXPORT jstring JNICALL Java_hu_uniobuda_nik_nativeapplication_AwesomeLogic_getLogic VersionName (JNIEnv *env, jclass clazz) { return (*env)->NewStringUTF(env, "Hello JNI"); } Sicz-Mesziár János
11/27/2016
7
NDK a gyakorlatban (2) 6.
Android.mk fájl létrehozása LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hu_uniobuda_nik_nativeapplication_AwesomeLogic LOCAL_SRC_FILES := hu_uniobuda_nik_nativeapplication_AwesomeLogic.c LOCAL_LDLIBS += -llog LOCAL_EXPORT_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
7.
Application.mk fájl létrehozása APP_ABI := all
8.
Natív kód fordítása > cd app\src\main\jni > c:\android-ndk-r11c\ndk-build
9.
Library inicializálás a Java osztályunkban: static { System.loadLibrary("hu_uniobuda_nik_nativeapplication_Awes omeLogic"); } Sicz-Mesziár János
11/27/2016
8
Java C/C++ típusok Típusok, lásd itt: $NDK\platforms\android-23\arch-arm\usr\include\jni.h
Sicz-Mesziár János
11/27/2016
9
Java C/C++ típusok Referencia típusok:
Sicz-Mesziár János
11/27/2016
10
Java C/C++ konverziók Néhány példa konverziókra: // use jboolean jboolean isCopy; // java string (jstring) to char* const char * res = env->GetStringUTFChars(mystring, &isCopy); // check JNI boolean true if(isCopy == JNI_TRUE) (*env)->ReleaseStringUTFChars(mystring, res); // release
// create new jstring return (*env)->NewStringUTF((const char* )result.c_str());
Lásd még itt: https://developer.android.com/training/articles/perf-jni.html
Sicz-Mesziár János
11/27/2016
11