Mobil Informatikai Rendszerek Android NDK Native Development Kit 2016. november 27. Sicz-Mesziár János sicz- m e s z i a r. j a n o s @ nik.uni - obuda.hu
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: 1. NDK letöltése: 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 C- ben í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\android- 23\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