SlideShare uma empresa Scribd logo
1 de 52
Baixar para ler offline
Using the Android* Native Development Kit (NDK) 
Xavier Hallade, Developer Evangelist, Intel Corporation 
@ph0b -ph0b.com
2 
Agenda 
•The Android* Native Development Kit (NDK) 
•How to use the NDK 
•Supporting several CPU architectures 
•Debug and Optimization 
•Q&A
The Android Native Development Kit (NDK)
4 
Android*Native Development Kit (NDK) 
What is it? 
•Build scripts/toolkit to incorporate native code in Android*apps via the Java Native Interface (JNI) 
Why use it? 
•Performance 
•e.g., complex algorithms, multimedia applications, games 
•Differentiation 
•app that takes advantage of direct CPU/HW access 
•e.g., using SSE4.2 for optimization 
•Software code reuse 
Why not use it? 
•Performance improvement isn’t always guaranteed, the complexity is…
5 
PSI 
TS 
PIDs 
Installing the Android*NDK 
NDK is a platform dependent archive (self-extracting since r10c). 
It provides: 
•Build script ndk-build(.cmd) 
•Other scripts for toolchainsgeneration, debug, etc 
•Android*headers and libraries 
•gcc/clang crosscompilers 
•Documentation and samples(useful and not easy to find online)
6 
C/C++ 
Code 
Makefile 
ndk- build 
Mix with Java* 
GDB debug 
Java 
SDK APIs 
Native Libs 
Android*Application 
NDK APIs 
C/C++ 
NDK Application Development 
Using JNI 
JNI
7 
NDK Platform 
Android*NDK Application 
Dalvik*Application 
Java Class 
Java Source 
Compile with Javac 
Java Class 
JavaSource 
Compile with Javac 
Create C header with javah-jni 
Header file 
C/C++ Source Code 
Compile and Link C Code (ndk-build) 
Dynamic Library (.so) 
*.mkMakefiles 
Optional thanks to JNI_Onload 
loads
8 
Compatibility with Standard C/C++ 
Bionic C Library: 
Lighter than standard GNU C Library 
Not POSIX compliant 
pthreadsupport included, but limited 
No System-V IPCs 
Access to Android* system properties 
Bionic is not binary-compatible with the standard Clibrary 
It means you generally need to (re)compile everything using the Android NDK toolchain
9 
Android*C++ Support 
By default, system is used. It lacks: 
Standard C++ Library support (except some headers) 
C++ exceptions support 
RTTI support 
Fortunately, you have other libs available with the NDK: 
Runtime 
Exceptions 
RTTI 
STL 
system 
No 
No 
No 
gabi++ 
Yes 
Yes 
No 
stlport 
Yes 
Yes 
Yes 
gnustl 
Yes 
Yes 
Yes 
libc++ 
Yes 
Yes 
Yes 
Choose which library to compile against in your Makefile(Application.mk file): 
APP_STL := gnustl_shared 
Postfix the runtime with _static or _shared 
For using C++ features, you also need to enable these in your Makefile: 
LOCAL_CPP_FEATURES += exceptions rtti
How to use the NDK
11 
1. Create JNI folder for native sources 
3. Create Android.mk Makefile 
2. Reuse or create native c/c++ sources 
4. Call ndk-build to generated shared libraries into ABI libs folders 
Manually Adding Native Code to an Android*Project
12 
PSI 
TS 
PIDs 
Integrating Native Functions with Java* 
Declare native methods in your Android*application (Java*) using the ‘native’ keyword: 
public native String stringFromJNI(); 
Provide a native shared library built with the NDK that contains the methods used by your application: 
libMyLib.so 
Your application must load the shared library (before use… during class load for example): 
static { 
System.loadLibrary("MyLib"); 
} 
There is two ways to associate your native code to the Java methods: javahand JNI_OnLoad
13 
Classic Execution flow 
Loading Java Class (executing static block) 
Loading native library 
(and calling its JNI_OnLoad) 
Native library loaded 
Java Class loaded 
Executing Java Code 
Encountering a native method 
Runtime executes native method 
Returning to Java Code execution, throwing any remaining Java exceptions 
And later, from any thread:
14 
JavahMethodjstringJava_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*env, jobjectthiz) { return(*env)->NewStringUTF(env,"Hello from JNI !"); } ... { ... tv.setText(stringFromJNI()); ... } publicnativeString stringFromJNI(); static{ System.loadLibrary("hello-jni"); }
15 
JavahMethod 
“javah” generates the appropriate JNI header stubs from the compiled Java classes files. 
Example: 
> javah–d jni–classpathbin/classes com.example.hellojni.HelloJni 
Generates com_example_hellojni_HelloJni.hfile with this definition: 
JNIEXPORT jstringJNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*,jobject);
16 
Android Makefiles(*.mk) 
Android.mkmodule settings and declarationsLOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:=hello-jniLOCAL_SRC_FILES:=hello-jni.cinclude $(BUILD_SHARED_LIBRARY) Predefined macro can be: BUILD_SHARED_LIBRARY, BUILD_STATIC_LIBRARY, PREBUILT_SHARED_LIBRARY, PREBUILT_STATIC_LIBRARYOther useful variables: LOCAL_C_INCLUDES:=./headers/ LOCAL_EXPORT_C_INCLUDES:=./headers/ LOCAL_SHARED_LIBRARIES:=module_sharedLOCAL_STATIC_LIBRARIES:=module_static 
Application.mk Application-wide settingsAPP_PLATFORM:= android-15#~=minSDKVersionAPP_CFLAGS:= -O3APP_STL:= gnustl_shared#or other STL if you need extended C++ supportAPP_ABI:= all #or all32, all64… APP_OPTIM:= release #defaultNDK_TOOCLHAIN_VERSION:= 4.8 #4.6 is default, 4.8 brings perfs, 4.9 also but less stable
Working with the Java Native Interface
18 
JNI Primitive Types 
Java*Type 
Native Type 
Description 
boolean 
jboolean 
unsigned 8 bits 
byte 
jbyte 
signed 8 bits 
char 
jchar 
unsigned 16 bits 
short 
jshort 
signed 16 bits 
int 
jint 
signed 32 bits 
long 
jlong 
signed 64 bits 
float 
jfloat 
32 bits 
double 
jdouble 
64 bits 
void 
void 
N/A
19 
JNI Reference Types 
jobject 
jclass 
jstring 
jarray 
jobjectArray 
jbooleanArray 
jbyteArray 
jcharArray 
jshortArray 
jintArray 
jlongArray 
jfloatArray 
jdoubleArray 
jthrowable 
Arrays elements are manipulated using Get<type>ArrayElements() and Get/Set<type>ArrayRegion() 
Don’t forget to call ReleaseXXX() for each GetXXX() call.
20 
Creating a Java*String 
•Memory is handled by the JVM, jstringis always a reference. 
•You can call DeleteLocalRef() on it once you finished with it. 
Main difference with using JNI from C or in C++ is the nature of “env” as you can see it here. C: jstringstring = (*env)->NewStringUTF(env,"new Java String"); C++: jstringstring =env->NewStringUTF("new Java String");
21 
Memory Handling of Java*Objects 
Memory handling of Java*objects is done by the JVM: 
•You only deal with references to these objects 
•Each time you get a reference, you must not forget to delete it after use 
•local references are still automatically deleted when the native call returns to Java 
•References are local by default 
•Global references can be created using NewGlobalRef()
22 
Getting a C string from Java*Stringconstchar*nativeString=(*env)- >GetStringUTFChars(javaString,null); … (*env)->ReleaseStringUTFChars(env,javaString,nativeString); //more secure, more efficient if you want a copy anywayinttmpjstrlen=env->GetStringUTFLength(tmpjstr); char*fname=newchar[tmpjstrlen+1]; env->GetStringUTFRegion(tmpjstr,0,tmpjstrlen,fname); fname[tmpjstrlen]=0; … delete fname;
23 
Calling Java* Methods 
On an object instance: jclassclazz=(*env)->GetObjectClass(env,obj); jmethodIDmid =(*env)->GetMethodID(env,clazz,"methodName", "(…)…"); if(mid !=NULL) (*env)->Call<Type>Method(env,obj,mid,parameters…); 
Static call: jclassclazz=(*env)->FindClass(env,"java/lang/String"); jmethodIDmid =(*env)->GetStaticMethodID(env,clazz,"methodName", "(…)…"); if(mid !=NULL) (*env)->CallStatic<Type>Method(env,clazz,mid,parameters…); 
•(…)…: method signature 
•parameters: list of parameters expected by the Java*method 
•<Type>: Java method return type
24 
Handling Java*Exceptions// call to java methods may throw Java exceptionsjthrowableex =(*env)->ExceptionOccurred(env); if(ex!=NULL){ (*env)->ExceptionClear(env); // deal with exception} (*env)->DeleteLocalRef(env,ex);
25 
Throwing Java* Exceptionsjclassclazz= (*env->FindClass(env,"java/lang/Exception"); if(clazz!=NULL) (*env)->ThrowNew(env,clazz,"Message"); 
The exception will be thrown only when the JNI call returns to Java*, it will not break the current native code execution.
Supporting several CPU architectures
27 
Android* Devices with Intel Inside(Some of them –there are more than hundred, not all could be listed here) 
Motorola* RAZR i 
ZTE* Grand X IN 
Lava* XoloX900 
Megafon* Mint 
Lenovo* K800 
Orange* San Diego 
2012, 2013… 
Lenovo* K900 
ASUS Fonepad™ Note FHD -6” 
ZTE* Geek 
Samsung* Galaxy™ Tab 3 10.1” 
2014… 
Asus* Zenfones4/5/6 
ASUS* Transformer Pad TF103CG/TF303CL 
Dell* Venue 8 7000 
Intel® Yolo 
Acer* Liquid C1 
EtisalatE-20* 
ASUS* MeMOPad FHD 10 
ASUS* Fonepad™ 7” 
Dell* Venue 7/8 
KD Interactive 
Kurio Tablet 
Toshiba 
Excite Go 
Acer* IconiaTab 8 
/ One 8 
Nexus Player 
Lenovo* S8 
Asus* MemoPad7/8 
Asus* FonePad7/8 
Lenovo Yoga Tab 2 8/10/13 
Tesco Hudl2
28 
Include all ABIs by setting APP_ABI to all in jni/Application.mk: 
APP_ABI=all 
The NDK will generate optimized code for all target ABIs 
You can also pass APP_ABI variable to ndk-build, and specify each ABI: 
ndk-build APP_ABI=x86 #all32 andall64are also possible values. 
Configuring NDK Target ABIs 
Build ARM64 libs 
Build x86_64 libs 
Build mips64 libs 
Build ARMv7a libs 
Build ARMv5 libs 
Build x86 libs 
Build mipslibs
29 
“Fat” APKs 
By default, an APK contains libraries for every supported ABIs. 
Install lib/armeabi-v7a libs 
Install lib/x86 libs 
Install lib/x86_64 libraries 
libs/x86 
libs/x86_64 
APK file 
… 
Libs for the selected ABI are installed, the others remain inside the downloaded APK 
… … … 
libs/armeabi-v7a
30 
Multiple APKs 
Google Play* supports multiple APKs for the same application. 
What compatible APK will be chosen for a device entirely depends on the android:versionCode 
If you have multiple APKs for multiple ABIs, best is to simply prefix your current version code with a digit representing the ABI: 
2310 33106310 7310 
You can have more options for multiple APKs, here is a convention that will work if you’re using all of these: 
x86 
ARMv7 
ARM64 
X86_64
31 
Multiple APKs –clean solution with gradlesplits { abi{ enable truereset() include 'x86','x86_64','armeabi-v7a','arm64-v8a'universalApktrue} } // map for the version codeproject.ext.versionCodes=['armeabi':1,'armeabi-v7a':2,'arm64-v8a':3,'mips':5, 'mips64':6,'x86':8,'x86_64':9] android.applicationVariants.all{variant -> // assign different version code for each outputvariant.outputs.each{output -> output.versionCodeOverride= project.ext.versionCodes.get(output.abiFilter,0)*1000000+ android.defaultConfig.versionCode} }
32 
Uploading Multiple APKs to the store 
Switch to Advanced mode beforeuploading the second APK.
33 
3rd party libraries x86 support 
Game engines/libraries with x86 support: 
•HavokAnarchy SDK: android x86 target available 
•Unreal Engine 3: android x86 target available 
•Marmalade: android x86 target available 
•Cocos2Dx: set APP_ABI in Application.mk 
•FMOD: x86 lib already included, set ABIs in Application.mk 
•AppGameKit: x86 lib included, set ABIs in Application.mk 
•libgdx: x86 supported by default in latest releases 
•AppPortable: x86 support now available 
•Adobe Air: x86 support now available 
•Unity: in beta, will be released soon. 
•…
Debugging native code
35 
Debugging with logcat 
NDK provides log API in <android/log.h>: 
Usually used through this sort of macro: 
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "APPTAG", __VA_ARGS__)) 
Usage Example: 
LOGI("accelerometer: x=%f y=%f z=%f", x, y, z); int__android_log_print(intprio,constchar*tag, constchar*fmt,...)
36 
Debugging with logcat 
To get more information on native code execution: 
adbshell setpropdebug.checkjni1 
(already enabled by default in the emulator) 
And to get memory debug information (root only): 
adbshell setproplibc.debug.malloc1 
-> leak detection 
adbshell setproplibc.debug.malloc10 
-> overruns detection 
adbshellstart/stop-> reload environment
37 
Debugging with GDB and Eclipse 
Native support must be added to your project 
Pass NDK_DEBUG=1 APP_OPTIM=debug to the ndk-build command, from the project properties: 
NDK_DEBUG flag is supposed to be automatically set for a debug build, but this is not currently the case.
38 
Debugging with GDB and Eclipse* 
When NDK_DEBUG=1 is specified, a “gdbserver” file is added to your libraries
39 
Debugging with GDB and Eclipse* 
Debug your project as a native Android* application:
40 
Debugging with GDB and Eclipse 
From Eclipse “Debug” perspective, you can manipulate breakpoints and debug your project 
Your application will run before the debugger is attached, hence breakpoints you set near application launch will be ignored
Going further with the NDK
42 
Android*NDK Samples 
Sample App 
Type 
hello-jni 
Call anative function written in C from Java*. 
bitmap-plasma 
Access an Android*Bitmap object from C. 
san-angeles 
EGL and OpenGL*ES code in C. 
hello-gl2 
EGL setup in Javaand OpenGL ES code in C. 
native-activity 
C only OpenGL sample(no Java, uses the NativeActivityclass). 
two-libs 
Integratesmore than one library 
…
43 
JNI_OnLoadMethod –Why ? 
•Proven method 
•No more surprises after methods registration 
•Less error prone when refactoring 
•Add/remove native functions easily 
•No symbol table issue when mixing C/C++ code 
•Best spot to cache Java*class object references
44 
JNI_OnLoadMethod 
In your library name your functions as you wish and declare the mapping with JVM methods: jstringstringFromJNI(JNIEnv*env,jobjectthiz) {returnenv->NewStringUTF("Hello from JNI !");} staticJNINativeMethodexposedMethods[]={ {"stringFromJNI","()Ljava/lang/String;",(void*)stringFromJNI}, } 
()Ljava/lang/String; is the JNI signature of the Java*method, you can retrieve it using the javap utility: 
> javap -s -classpathbinclasses -p com.example.hellojni.HelloJni 
Compiled from "HelloJni.java" 
… 
public native java.lang.StringstringFromJNI(); 
Signature: ()Ljava/lang/String; 
…
45 
JNI_OnLoadMethod 
JNI_OnLoadis the library entry point called during load. 
Here it applies the mapping defined on the previous slide. extern "C" jintJNI_OnLoad(JavaVM*vm,void*reserved) { JNIEnv*env; if(vm->GetEnv(reinterpret_cast<void**>(&env),JNI_VERSION_1_6)!= JNI_OK) returnJNI_ERR; jclassclazz=env->FindClass("com/example/hellojni/HelloJni"); if(clazz==NULL) returnJNI_ERR; env->RegisterNatives(clazz,exposedMethods, sizeof(exposedMethods)/sizeof(JNINativeMethod)); env->DeleteLocalRef(clazz); returnJNI_VERSION_1_6; }
46 
Vectorization 
SIMD instructions up to SSSE3 available on current Intel® Atom™ processor based platforms, Intel® SSE4.2 on the Intel SilvermontMicroarchitecture 
On ARM*, you can get vectorizationthrough the ARM NEON* instructions 
Two classic ways to use these instructions: 
•Compiler auto-vectorization 
•Compiler intrinsics 
Optimization Notice 
Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not uniqueto Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability,functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Pleaserefer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. 
Notice revision #20110804 
SSSE3, SSE4.2 
Vector size: 128 bit 
Data types: 
•8, 16, 32, 64 bit integer 
•32 and 64 bit float 
VL: 2, 4, 8, 16 
X2 
Y2 
X2◦Y2 
X1 
Y1 
X1◦Y1 
X4 
Y4 
X4◦Y4 
X3 
Y3 
X3◦Y3 
127 
0
47 
GCC Flags 
ffast-math influence round-off of fparithmetic and so breaks strict IEEE compliance 
The other optimizations are totally safe 
Add -ftree-vectorizer-verbose to get a vectorizationreportNDK_TOOLCHAIN_VERSION:=4.8 or4.9 in Application.mk to use latest versionifeq($(TARGET_ARCH_ABI),x86) LOCAL_CFLAGS +=-ffast-math -mtune=atom -mssse3 -mfpmath=sseendififeq($(TARGET_ARCH_ABI),x86_64) LOCAL_CFLAGS +=-ffast-math -mtune=slm–msse4.2endif 
Optimization Notice 
Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not uniqueto Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability,functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Pleaserefer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. 
Notice revision #20110804
48 
Android* Studio NDK support 
•Having .c(pp) sources inside jnifolder ? 
•ndk-build automatically called on a generated Android.mk, ignoring any existing .mk 
•All configuration done through build.gradle(moduleName, ldLibs, cFlags, stl) 
•You can change that to continue relying on your own Makefiles: 
http://ph0b.com/android-studio-gradle-and-ndk-integration/ 
•Having .so files to integrate ? 
•Copy them to jniLibs/ABI folders or integrate them from a .aarlibrary 
•Use APK splits to generate one APK per arch with a computed versionCode 
http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
Q&A 
xavier.hallade@intel.com 
@ph0b–ph0b.com
51 
Some last comments 
•In Application.mk, ANDROID_PLATFORM must be the same as your minSdkLevel. This is especially important with Android-L. 
•With Android L (ART), JNI is more strict than before: 
•pay attention to objects and JNIEnvreferences, threads and methods mapping
57 
Multiple Code Paths 
Compiler macros 
#ifdef__i386__ 
strlcat(buf, "i386", sizeof(buf)); 
#endif 
#ifdef__arm__ 
strlcat(buf, "arm", sizeof(buf)); 
#endif 
#ifdef__mips__ 
strlcat(buf, "mips", sizeof(buf)); 
#endif 
#ifdef__x86_64__ 
strlcat(buf, “x86_64", sizeof(buf)); 
#endif 
#ifdef__aarch64__ 
strlcat(buf, “arm64", sizeof(buf)); 
#endif 
#ifdef__mips64 
strlcat(buf, "mips64", sizeof(buf)); 
#endififeq($(TARGET_ARCH_ABI),x86) LOCAL_SRC_FILES += … endififeq($(TARGET_ARCH_ABI),x86_64) LOCAL_SRC_FILES += … endif 
… 
Makefileconditions
60 
Analyzing what is getting installed on a devicehttps://play.google.com/store/apps/details?id= com.xh.nativelibsmonitor.app

Mais conteúdo relacionado

Mais procurados

Learning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device DriverLearning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device DriverNanik Tolaram
 
Android's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALAndroid's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALOpersys inc.
 
Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overviewJerrin George
 
Android booting sequece and setup and debugging
Android booting sequece and setup and debuggingAndroid booting sequece and setup and debugging
Android booting sequece and setup and debuggingUtkarsh Mankad
 
Learning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessLearning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessNanik Tolaram
 
Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Opersys inc.
 
Android Binder IPC for Linux
Android Binder IPC for LinuxAndroid Binder IPC for Linux
Android Binder IPC for LinuxYu-Hsin Hung
 
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspectiveAndroid graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspectiveBin Chen
 
Android Camera Architecture
Android Camera ArchitectureAndroid Camera Architecture
Android Camera ArchitecturePicker Weng
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesChris Simmonds
 
Understaing Android EGL
Understaing Android EGLUnderstaing Android EGL
Understaing Android EGLSuhan Lee
 
Q4.11: Porting Android to new Platforms
Q4.11: Porting Android to new PlatformsQ4.11: Porting Android to new Platforms
Q4.11: Porting Android to new PlatformsLinaro
 

Mais procurados (20)

Learning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device DriverLearning AOSP - Android Linux Device Driver
Learning AOSP - Android Linux Device Driver
 
Android JNI
Android JNIAndroid JNI
Android JNI
 
Embedded Android : System Development - Part III (Audio / Video HAL)
Embedded Android : System Development - Part III (Audio / Video HAL)Embedded Android : System Development - Part III (Audio / Video HAL)
Embedded Android : System Development - Part III (Audio / Video HAL)
 
Android's HIDL: Treble in the HAL
Android's HIDL: Treble in the HALAndroid's HIDL: Treble in the HAL
Android's HIDL: Treble in the HAL
 
Android media framework overview
Android media framework overviewAndroid media framework overview
Android media framework overview
 
Android booting sequece and setup and debugging
Android booting sequece and setup and debuggingAndroid booting sequece and setup and debugging
Android booting sequece and setup and debugging
 
Design and Concepts of Android Graphics
Design and Concepts of Android GraphicsDesign and Concepts of Android Graphics
Design and Concepts of Android Graphics
 
Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)Embedded Android : System Development - Part IV (Android System Services)
Embedded Android : System Development - Part IV (Android System Services)
 
Deep Dive into the AOSP
Deep Dive into the AOSPDeep Dive into the AOSP
Deep Dive into the AOSP
 
Learning AOSP - Android Booting Process
Learning AOSP - Android Booting ProcessLearning AOSP - Android Booting Process
Learning AOSP - Android Booting Process
 
Android presentation
Android presentationAndroid presentation
Android presentation
 
Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013
 
Android Binder IPC for Linux
Android Binder IPC for LinuxAndroid Binder IPC for Linux
Android Binder IPC for Linux
 
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspectiveAndroid graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
 
Embedded Android : System Development - Part II (HAL)
Embedded Android : System Development - Part II (HAL)Embedded Android : System Development - Part II (HAL)
Embedded Android : System Development - Part II (HAL)
 
Android Camera Architecture
Android Camera ArchitectureAndroid Camera Architecture
Android Camera Architecture
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot images
 
Understaing Android EGL
Understaing Android EGLUnderstaing Android EGL
Understaing Android EGL
 
Q4.11: Porting Android to new Platforms
Q4.11: Porting Android to new PlatformsQ4.11: Porting Android to new Platforms
Q4.11: Porting Android to new Platforms
 
Embedded Android : System Development - Part I
Embedded Android : System Development - Part IEmbedded Android : System Development - Part I
Embedded Android : System Development - Part I
 

Destaque

Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)DroidConTLV
 
Android™組込み開発基礎コース BeagleBoard編
Android™組込み開発基礎コース BeagleBoard編Android™組込み開発基礎コース BeagleBoard編
Android™組込み開発基礎コース BeagleBoard編OESF Education
 
Introduction to the Android NDK
Introduction to the Android NDKIntroduction to the Android NDK
Introduction to the Android NDKBeMyApp
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Mail.ru Group
 
Confidentiality of Information
Confidentiality of InformationConfidentiality of Information
Confidentiality of Informationrrevels57
 
React Native Android. It's easy.
React Native Android. It's easy.React Native Android. It's easy.
React Native Android. It's easy.Cameron Moss
 
Introduction of oesf education consortium
Introduction of oesf education consortiumIntroduction of oesf education consortium
Introduction of oesf education consortiumOESF Education
 
NDK Programming in Android
NDK Programming in AndroidNDK Programming in Android
NDK Programming in AndroidArvind Devaraj
 
Android 6.0 Marshmallow - Everything you need to know !
Android 6.0 Marshmallow - Everything you need to know !Android 6.0 Marshmallow - Everything you need to know !
Android 6.0 Marshmallow - Everything you need to know !Edureka!
 
Android組み込み開発テキスト pandaboard es編
Android組み込み開発テキスト pandaboard es編Android組み込み開発テキスト pandaboard es編
Android組み込み開発テキスト pandaboard es編OESF Education
 
Android組込み開発基礎コース Armadillo-440編
Android組込み開発基礎コース Armadillo-440編Android組込み開発基礎コース Armadillo-440編
Android組込み開発基礎コース Armadillo-440編OESF Education
 
Three.js 一場從2D變成3D的冒險
Three.js  一場從2D變成3D的冒險Three.js  一場從2D變成3D的冒險
Three.js 一場從2D變成3D的冒險智遠 成
 
An Overview of Android Things at jag201702
An Overview of Android Things at jag201702An Overview of Android Things at jag201702
An Overview of Android Things at jag201702Hiroki Ishizuka
 
인텔교육솔루션소개 Intel.Education.Solution
인텔교육솔루션소개 Intel.Education.Solution인텔교육솔루션소개 Intel.Education.Solution
인텔교육솔루션소개 Intel.Education.SolutionChoohan Cho
 
Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...
Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...
Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...Intel® Software
 
"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)
"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)
"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)AvitoTech
 

Destaque (20)

Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)Using the Android Native Development Kit (NDK)
Using the Android Native Development Kit (NDK)
 
Android™組込み開発基礎コース BeagleBoard編
Android™組込み開発基礎コース BeagleBoard編Android™組込み開発基礎コース BeagleBoard編
Android™組込み開発基礎コース BeagleBoard編
 
Android ndk: Entering the native world
Android ndk: Entering the native worldAndroid ndk: Entering the native world
Android ndk: Entering the native world
 
Introduction to the Android NDK
Introduction to the Android NDKIntroduction to the Android NDK
Introduction to the Android NDK
 
NDK Introduction
NDK IntroductionNDK Introduction
NDK Introduction
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
 
Android ndk
Android ndkAndroid ndk
Android ndk
 
Confidentiality of Information
Confidentiality of InformationConfidentiality of Information
Confidentiality of Information
 
How to Add Original Library to Android NDK
How to Add Original Library to Android NDKHow to Add Original Library to Android NDK
How to Add Original Library to Android NDK
 
React Native Android. It's easy.
React Native Android. It's easy.React Native Android. It's easy.
React Native Android. It's easy.
 
Introduction of oesf education consortium
Introduction of oesf education consortiumIntroduction of oesf education consortium
Introduction of oesf education consortium
 
NDK Programming in Android
NDK Programming in AndroidNDK Programming in Android
NDK Programming in Android
 
Android 6.0 Marshmallow - Everything you need to know !
Android 6.0 Marshmallow - Everything you need to know !Android 6.0 Marshmallow - Everything you need to know !
Android 6.0 Marshmallow - Everything you need to know !
 
Android組み込み開発テキスト pandaboard es編
Android組み込み開発テキスト pandaboard es編Android組み込み開発テキスト pandaboard es編
Android組み込み開発テキスト pandaboard es編
 
Android組込み開発基礎コース Armadillo-440編
Android組込み開発基礎コース Armadillo-440編Android組込み開発基礎コース Armadillo-440編
Android組込み開発基礎コース Armadillo-440編
 
Three.js 一場從2D變成3D的冒險
Three.js  一場從2D變成3D的冒險Three.js  一場從2D變成3D的冒險
Three.js 一場從2D變成3D的冒險
 
An Overview of Android Things at jag201702
An Overview of Android Things at jag201702An Overview of Android Things at jag201702
An Overview of Android Things at jag201702
 
인텔교육솔루션소개 Intel.Education.Solution
인텔교육솔루션소개 Intel.Education.Solution인텔교육솔루션소개 Intel.Education.Solution
인텔교육솔루션소개 Intel.Education.Solution
 
Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...
Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...
Intel® RealSense™ Technology: Code Walk-through Presented by Intel Software I...
 
"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)
"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)
"Kotlin для Android: 1.0 и далее" Дмитрий Жемеров (JetBrains)
 

Semelhante a Using the Android Native Development Kit (NDK)

Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014Paris Android User Group
 
Cross Platform App Development with C++
Cross Platform App Development with C++Cross Platform App Development with C++
Cross Platform App Development with C++Joan Puig Sanz
 
Android NDK Intro
Android NDK IntroAndroid NDK Intro
Android NDK IntroGiles Payne
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel ToolsXavier Hallade
 
Getting started with the NDK
Getting started with the NDKGetting started with the NDK
Getting started with the NDKKirill Kounik
 
Advance Android Application Development
Advance Android Application DevelopmentAdvance Android Application Development
Advance Android Application DevelopmentRamesh Prasad
 
What is Java Technology (An introduction with comparision of .net coding)
What is Java Technology (An introduction with comparision of .net coding)What is Java Technology (An introduction with comparision of .net coding)
What is Java Technology (An introduction with comparision of .net coding)Shaharyar khan
 
Working with the AOSP - Linaro Connect Asia 2013
Working with the AOSP - Linaro Connect Asia 2013Working with the AOSP - Linaro Connect Asia 2013
Working with the AOSP - Linaro Connect Asia 2013Opersys inc.
 
Android NDK and the x86 Platform
Android NDK and the x86 PlatformAndroid NDK and the x86 Platform
Android NDK and the x86 PlatformSebastian Mauer
 
JNA - Let's C what it's worth
JNA - Let's C what it's worthJNA - Let's C what it's worth
JNA - Let's C what it's worthIdan Sheinberg
 
Moving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresMoving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresFrits Van Der Holst
 
Native Android for Windows Developers
Native Android for Windows DevelopersNative Android for Windows Developers
Native Android for Windows DevelopersYoss Cohen
 
Native development kit (ndk) introduction
Native development kit (ndk)  introductionNative development kit (ndk)  introduction
Native development kit (ndk) introductionRakesh Jha
 
NDK Primer (AnDevCon Boston 2014)
NDK Primer (AnDevCon Boston 2014)NDK Primer (AnDevCon Boston 2014)
NDK Primer (AnDevCon Boston 2014)Ron Munitz
 
Tamir Dresher - Demystifying the Core of .NET Core
Tamir Dresher  - Demystifying the Core of .NET CoreTamir Dresher  - Demystifying the Core of .NET Core
Tamir Dresher - Demystifying the Core of .NET CoreTamir Dresher
 
Zephyr RTOS in One Hour | HARDWARIO @ IoT North UK
Zephyr RTOS in One Hour | HARDWARIO @ IoT North UKZephyr RTOS in One Hour | HARDWARIO @ IoT North UK
Zephyr RTOS in One Hour | HARDWARIO @ IoT North UKHARDWARIO
 
Cross-compilation native sous android
Cross-compilation native sous androidCross-compilation native sous android
Cross-compilation native sous androidThierry Gayet
 

Semelhante a Using the Android Native Development Kit (NDK) (20)

Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014
 
Cross Platform App Development with C++
Cross Platform App Development with C++Cross Platform App Development with C++
Cross Platform App Development with C++
 
Getting Native with NDK
Getting Native with NDKGetting Native with NDK
Getting Native with NDK
 
Android NDK Intro
Android NDK IntroAndroid NDK Intro
Android NDK Intro
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel Tools
 
NodeJS for Beginner
NodeJS for BeginnerNodeJS for Beginner
NodeJS for Beginner
 
Getting started with the NDK
Getting started with the NDKGetting started with the NDK
Getting started with the NDK
 
Advance Android Application Development
Advance Android Application DevelopmentAdvance Android Application Development
Advance Android Application Development
 
What is Java Technology (An introduction with comparision of .net coding)
What is Java Technology (An introduction with comparision of .net coding)What is Java Technology (An introduction with comparision of .net coding)
What is Java Technology (An introduction with comparision of .net coding)
 
Working with the AOSP - Linaro Connect Asia 2013
Working with the AOSP - Linaro Connect Asia 2013Working with the AOSP - Linaro Connect Asia 2013
Working with the AOSP - Linaro Connect Asia 2013
 
Android NDK and the x86 Platform
Android NDK and the x86 PlatformAndroid NDK and the x86 Platform
Android NDK and the x86 Platform
 
JNA - Let's C what it's worth
JNA - Let's C what it's worthJNA - Let's C what it's worth
JNA - Let's C what it's worth
 
Moving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresMoving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventures
 
Native Android for Windows Developers
Native Android for Windows DevelopersNative Android for Windows Developers
Native Android for Windows Developers
 
Native development kit (ndk) introduction
Native development kit (ndk)  introductionNative development kit (ndk)  introduction
Native development kit (ndk) introduction
 
NDK Primer (AnDevCon Boston 2014)
NDK Primer (AnDevCon Boston 2014)NDK Primer (AnDevCon Boston 2014)
NDK Primer (AnDevCon Boston 2014)
 
Tamir Dresher - Demystifying the Core of .NET Core
Tamir Dresher  - Demystifying the Core of .NET CoreTamir Dresher  - Demystifying the Core of .NET Core
Tamir Dresher - Demystifying the Core of .NET Core
 
Zephyr RTOS in One Hour | HARDWARIO @ IoT North UK
Zephyr RTOS in One Hour | HARDWARIO @ IoT North UKZephyr RTOS in One Hour | HARDWARIO @ IoT North UK
Zephyr RTOS in One Hour | HARDWARIO @ IoT North UK
 
Book
BookBook
Book
 
Cross-compilation native sous android
Cross-compilation native sous androidCross-compilation native sous android
Cross-compilation native sous android
 

Mais de Xavier Hallade

BCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUsBCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUsXavier Hallade
 
Apps development for Recon HUDs
Apps development for Recon HUDsApps development for Recon HUDs
Apps development for Recon HUDsXavier Hallade
 
Etendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidEtendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidXavier Hallade
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginXavier Hallade
 
Power optimization for Android apps
Power optimization for Android appsPower optimization for Android apps
Power optimization for Android appsXavier Hallade
 
Getting your app on Android TV
Getting your app on Android TVGetting your app on Android TV
Getting your app on Android TVXavier Hallade
 
Using the Presentation API and external screens on Android
Using the Presentation API and external screens on AndroidUsing the Presentation API and external screens on Android
Using the Presentation API and external screens on AndroidXavier Hallade
 

Mais de Xavier Hallade (7)

BCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUsBCON22: oneAPI backend - Blender Cycles on Intel GPUs
BCON22: oneAPI backend - Blender Cycles on Intel GPUs
 
Apps development for Recon HUDs
Apps development for Recon HUDsApps development for Recon HUDs
Apps development for Recon HUDs
 
Etendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs androidEtendre ses applications aux smartwatches et TVs android
Etendre ses applications aux smartwatches et TVs android
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
 
Power optimization for Android apps
Power optimization for Android appsPower optimization for Android apps
Power optimization for Android apps
 
Getting your app on Android TV
Getting your app on Android TVGetting your app on Android TV
Getting your app on Android TV
 
Using the Presentation API and external screens on Android
Using the Presentation API and external screens on AndroidUsing the Presentation API and external screens on Android
Using the Presentation API and external screens on Android
 

Último

Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 

Último (20)

Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 

Using the Android Native Development Kit (NDK)

  • 1. Using the Android* Native Development Kit (NDK) Xavier Hallade, Developer Evangelist, Intel Corporation @ph0b -ph0b.com
  • 2. 2 Agenda •The Android* Native Development Kit (NDK) •How to use the NDK •Supporting several CPU architectures •Debug and Optimization •Q&A
  • 3. The Android Native Development Kit (NDK)
  • 4. 4 Android*Native Development Kit (NDK) What is it? •Build scripts/toolkit to incorporate native code in Android*apps via the Java Native Interface (JNI) Why use it? •Performance •e.g., complex algorithms, multimedia applications, games •Differentiation •app that takes advantage of direct CPU/HW access •e.g., using SSE4.2 for optimization •Software code reuse Why not use it? •Performance improvement isn’t always guaranteed, the complexity is…
  • 5. 5 PSI TS PIDs Installing the Android*NDK NDK is a platform dependent archive (self-extracting since r10c). It provides: •Build script ndk-build(.cmd) •Other scripts for toolchainsgeneration, debug, etc •Android*headers and libraries •gcc/clang crosscompilers •Documentation and samples(useful and not easy to find online)
  • 6. 6 C/C++ Code Makefile ndk- build Mix with Java* GDB debug Java SDK APIs Native Libs Android*Application NDK APIs C/C++ NDK Application Development Using JNI JNI
  • 7. 7 NDK Platform Android*NDK Application Dalvik*Application Java Class Java Source Compile with Javac Java Class JavaSource Compile with Javac Create C header with javah-jni Header file C/C++ Source Code Compile and Link C Code (ndk-build) Dynamic Library (.so) *.mkMakefiles Optional thanks to JNI_Onload loads
  • 8. 8 Compatibility with Standard C/C++ Bionic C Library: Lighter than standard GNU C Library Not POSIX compliant pthreadsupport included, but limited No System-V IPCs Access to Android* system properties Bionic is not binary-compatible with the standard Clibrary It means you generally need to (re)compile everything using the Android NDK toolchain
  • 9. 9 Android*C++ Support By default, system is used. It lacks: Standard C++ Library support (except some headers) C++ exceptions support RTTI support Fortunately, you have other libs available with the NDK: Runtime Exceptions RTTI STL system No No No gabi++ Yes Yes No stlport Yes Yes Yes gnustl Yes Yes Yes libc++ Yes Yes Yes Choose which library to compile against in your Makefile(Application.mk file): APP_STL := gnustl_shared Postfix the runtime with _static or _shared For using C++ features, you also need to enable these in your Makefile: LOCAL_CPP_FEATURES += exceptions rtti
  • 10. How to use the NDK
  • 11. 11 1. Create JNI folder for native sources 3. Create Android.mk Makefile 2. Reuse or create native c/c++ sources 4. Call ndk-build to generated shared libraries into ABI libs folders Manually Adding Native Code to an Android*Project
  • 12. 12 PSI TS PIDs Integrating Native Functions with Java* Declare native methods in your Android*application (Java*) using the ‘native’ keyword: public native String stringFromJNI(); Provide a native shared library built with the NDK that contains the methods used by your application: libMyLib.so Your application must load the shared library (before use… during class load for example): static { System.loadLibrary("MyLib"); } There is two ways to associate your native code to the Java methods: javahand JNI_OnLoad
  • 13. 13 Classic Execution flow Loading Java Class (executing static block) Loading native library (and calling its JNI_OnLoad) Native library loaded Java Class loaded Executing Java Code Encountering a native method Runtime executes native method Returning to Java Code execution, throwing any remaining Java exceptions And later, from any thread:
  • 14. 14 JavahMethodjstringJava_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*env, jobjectthiz) { return(*env)->NewStringUTF(env,"Hello from JNI !"); } ... { ... tv.setText(stringFromJNI()); ... } publicnativeString stringFromJNI(); static{ System.loadLibrary("hello-jni"); }
  • 15. 15 JavahMethod “javah” generates the appropriate JNI header stubs from the compiled Java classes files. Example: > javah–d jni–classpathbin/classes com.example.hellojni.HelloJni Generates com_example_hellojni_HelloJni.hfile with this definition: JNIEXPORT jstringJNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*,jobject);
  • 16. 16 Android Makefiles(*.mk) Android.mkmodule settings and declarationsLOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:=hello-jniLOCAL_SRC_FILES:=hello-jni.cinclude $(BUILD_SHARED_LIBRARY) Predefined macro can be: BUILD_SHARED_LIBRARY, BUILD_STATIC_LIBRARY, PREBUILT_SHARED_LIBRARY, PREBUILT_STATIC_LIBRARYOther useful variables: LOCAL_C_INCLUDES:=./headers/ LOCAL_EXPORT_C_INCLUDES:=./headers/ LOCAL_SHARED_LIBRARIES:=module_sharedLOCAL_STATIC_LIBRARIES:=module_static Application.mk Application-wide settingsAPP_PLATFORM:= android-15#~=minSDKVersionAPP_CFLAGS:= -O3APP_STL:= gnustl_shared#or other STL if you need extended C++ supportAPP_ABI:= all #or all32, all64… APP_OPTIM:= release #defaultNDK_TOOCLHAIN_VERSION:= 4.8 #4.6 is default, 4.8 brings perfs, 4.9 also but less stable
  • 17. Working with the Java Native Interface
  • 18. 18 JNI Primitive Types Java*Type Native Type Description boolean jboolean unsigned 8 bits byte jbyte signed 8 bits char jchar unsigned 16 bits short jshort signed 16 bits int jint signed 32 bits long jlong signed 64 bits float jfloat 32 bits double jdouble 64 bits void void N/A
  • 19. 19 JNI Reference Types jobject jclass jstring jarray jobjectArray jbooleanArray jbyteArray jcharArray jshortArray jintArray jlongArray jfloatArray jdoubleArray jthrowable Arrays elements are manipulated using Get<type>ArrayElements() and Get/Set<type>ArrayRegion() Don’t forget to call ReleaseXXX() for each GetXXX() call.
  • 20. 20 Creating a Java*String •Memory is handled by the JVM, jstringis always a reference. •You can call DeleteLocalRef() on it once you finished with it. Main difference with using JNI from C or in C++ is the nature of “env” as you can see it here. C: jstringstring = (*env)->NewStringUTF(env,"new Java String"); C++: jstringstring =env->NewStringUTF("new Java String");
  • 21. 21 Memory Handling of Java*Objects Memory handling of Java*objects is done by the JVM: •You only deal with references to these objects •Each time you get a reference, you must not forget to delete it after use •local references are still automatically deleted when the native call returns to Java •References are local by default •Global references can be created using NewGlobalRef()
  • 22. 22 Getting a C string from Java*Stringconstchar*nativeString=(*env)- >GetStringUTFChars(javaString,null); … (*env)->ReleaseStringUTFChars(env,javaString,nativeString); //more secure, more efficient if you want a copy anywayinttmpjstrlen=env->GetStringUTFLength(tmpjstr); char*fname=newchar[tmpjstrlen+1]; env->GetStringUTFRegion(tmpjstr,0,tmpjstrlen,fname); fname[tmpjstrlen]=0; … delete fname;
  • 23. 23 Calling Java* Methods On an object instance: jclassclazz=(*env)->GetObjectClass(env,obj); jmethodIDmid =(*env)->GetMethodID(env,clazz,"methodName", "(…)…"); if(mid !=NULL) (*env)->Call<Type>Method(env,obj,mid,parameters…); Static call: jclassclazz=(*env)->FindClass(env,"java/lang/String"); jmethodIDmid =(*env)->GetStaticMethodID(env,clazz,"methodName", "(…)…"); if(mid !=NULL) (*env)->CallStatic<Type>Method(env,clazz,mid,parameters…); •(…)…: method signature •parameters: list of parameters expected by the Java*method •<Type>: Java method return type
  • 24. 24 Handling Java*Exceptions// call to java methods may throw Java exceptionsjthrowableex =(*env)->ExceptionOccurred(env); if(ex!=NULL){ (*env)->ExceptionClear(env); // deal with exception} (*env)->DeleteLocalRef(env,ex);
  • 25. 25 Throwing Java* Exceptionsjclassclazz= (*env->FindClass(env,"java/lang/Exception"); if(clazz!=NULL) (*env)->ThrowNew(env,clazz,"Message"); The exception will be thrown only when the JNI call returns to Java*, it will not break the current native code execution.
  • 26. Supporting several CPU architectures
  • 27. 27 Android* Devices with Intel Inside(Some of them –there are more than hundred, not all could be listed here) Motorola* RAZR i ZTE* Grand X IN Lava* XoloX900 Megafon* Mint Lenovo* K800 Orange* San Diego 2012, 2013… Lenovo* K900 ASUS Fonepad™ Note FHD -6” ZTE* Geek Samsung* Galaxy™ Tab 3 10.1” 2014… Asus* Zenfones4/5/6 ASUS* Transformer Pad TF103CG/TF303CL Dell* Venue 8 7000 Intel® Yolo Acer* Liquid C1 EtisalatE-20* ASUS* MeMOPad FHD 10 ASUS* Fonepad™ 7” Dell* Venue 7/8 KD Interactive Kurio Tablet Toshiba Excite Go Acer* IconiaTab 8 / One 8 Nexus Player Lenovo* S8 Asus* MemoPad7/8 Asus* FonePad7/8 Lenovo Yoga Tab 2 8/10/13 Tesco Hudl2
  • 28. 28 Include all ABIs by setting APP_ABI to all in jni/Application.mk: APP_ABI=all The NDK will generate optimized code for all target ABIs You can also pass APP_ABI variable to ndk-build, and specify each ABI: ndk-build APP_ABI=x86 #all32 andall64are also possible values. Configuring NDK Target ABIs Build ARM64 libs Build x86_64 libs Build mips64 libs Build ARMv7a libs Build ARMv5 libs Build x86 libs Build mipslibs
  • 29. 29 “Fat” APKs By default, an APK contains libraries for every supported ABIs. Install lib/armeabi-v7a libs Install lib/x86 libs Install lib/x86_64 libraries libs/x86 libs/x86_64 APK file … Libs for the selected ABI are installed, the others remain inside the downloaded APK … … … libs/armeabi-v7a
  • 30. 30 Multiple APKs Google Play* supports multiple APKs for the same application. What compatible APK will be chosen for a device entirely depends on the android:versionCode If you have multiple APKs for multiple ABIs, best is to simply prefix your current version code with a digit representing the ABI: 2310 33106310 7310 You can have more options for multiple APKs, here is a convention that will work if you’re using all of these: x86 ARMv7 ARM64 X86_64
  • 31. 31 Multiple APKs –clean solution with gradlesplits { abi{ enable truereset() include 'x86','x86_64','armeabi-v7a','arm64-v8a'universalApktrue} } // map for the version codeproject.ext.versionCodes=['armeabi':1,'armeabi-v7a':2,'arm64-v8a':3,'mips':5, 'mips64':6,'x86':8,'x86_64':9] android.applicationVariants.all{variant -> // assign different version code for each outputvariant.outputs.each{output -> output.versionCodeOverride= project.ext.versionCodes.get(output.abiFilter,0)*1000000+ android.defaultConfig.versionCode} }
  • 32. 32 Uploading Multiple APKs to the store Switch to Advanced mode beforeuploading the second APK.
  • 33. 33 3rd party libraries x86 support Game engines/libraries with x86 support: •HavokAnarchy SDK: android x86 target available •Unreal Engine 3: android x86 target available •Marmalade: android x86 target available •Cocos2Dx: set APP_ABI in Application.mk •FMOD: x86 lib already included, set ABIs in Application.mk •AppGameKit: x86 lib included, set ABIs in Application.mk •libgdx: x86 supported by default in latest releases •AppPortable: x86 support now available •Adobe Air: x86 support now available •Unity: in beta, will be released soon. •…
  • 35. 35 Debugging with logcat NDK provides log API in <android/log.h>: Usually used through this sort of macro: #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "APPTAG", __VA_ARGS__)) Usage Example: LOGI("accelerometer: x=%f y=%f z=%f", x, y, z); int__android_log_print(intprio,constchar*tag, constchar*fmt,...)
  • 36. 36 Debugging with logcat To get more information on native code execution: adbshell setpropdebug.checkjni1 (already enabled by default in the emulator) And to get memory debug information (root only): adbshell setproplibc.debug.malloc1 -> leak detection adbshell setproplibc.debug.malloc10 -> overruns detection adbshellstart/stop-> reload environment
  • 37. 37 Debugging with GDB and Eclipse Native support must be added to your project Pass NDK_DEBUG=1 APP_OPTIM=debug to the ndk-build command, from the project properties: NDK_DEBUG flag is supposed to be automatically set for a debug build, but this is not currently the case.
  • 38. 38 Debugging with GDB and Eclipse* When NDK_DEBUG=1 is specified, a “gdbserver” file is added to your libraries
  • 39. 39 Debugging with GDB and Eclipse* Debug your project as a native Android* application:
  • 40. 40 Debugging with GDB and Eclipse From Eclipse “Debug” perspective, you can manipulate breakpoints and debug your project Your application will run before the debugger is attached, hence breakpoints you set near application launch will be ignored
  • 42. 42 Android*NDK Samples Sample App Type hello-jni Call anative function written in C from Java*. bitmap-plasma Access an Android*Bitmap object from C. san-angeles EGL and OpenGL*ES code in C. hello-gl2 EGL setup in Javaand OpenGL ES code in C. native-activity C only OpenGL sample(no Java, uses the NativeActivityclass). two-libs Integratesmore than one library …
  • 43. 43 JNI_OnLoadMethod –Why ? •Proven method •No more surprises after methods registration •Less error prone when refactoring •Add/remove native functions easily •No symbol table issue when mixing C/C++ code •Best spot to cache Java*class object references
  • 44. 44 JNI_OnLoadMethod In your library name your functions as you wish and declare the mapping with JVM methods: jstringstringFromJNI(JNIEnv*env,jobjectthiz) {returnenv->NewStringUTF("Hello from JNI !");} staticJNINativeMethodexposedMethods[]={ {"stringFromJNI","()Ljava/lang/String;",(void*)stringFromJNI}, } ()Ljava/lang/String; is the JNI signature of the Java*method, you can retrieve it using the javap utility: > javap -s -classpathbinclasses -p com.example.hellojni.HelloJni Compiled from "HelloJni.java" … public native java.lang.StringstringFromJNI(); Signature: ()Ljava/lang/String; …
  • 45. 45 JNI_OnLoadMethod JNI_OnLoadis the library entry point called during load. Here it applies the mapping defined on the previous slide. extern "C" jintJNI_OnLoad(JavaVM*vm,void*reserved) { JNIEnv*env; if(vm->GetEnv(reinterpret_cast<void**>(&env),JNI_VERSION_1_6)!= JNI_OK) returnJNI_ERR; jclassclazz=env->FindClass("com/example/hellojni/HelloJni"); if(clazz==NULL) returnJNI_ERR; env->RegisterNatives(clazz,exposedMethods, sizeof(exposedMethods)/sizeof(JNINativeMethod)); env->DeleteLocalRef(clazz); returnJNI_VERSION_1_6; }
  • 46. 46 Vectorization SIMD instructions up to SSSE3 available on current Intel® Atom™ processor based platforms, Intel® SSE4.2 on the Intel SilvermontMicroarchitecture On ARM*, you can get vectorizationthrough the ARM NEON* instructions Two classic ways to use these instructions: •Compiler auto-vectorization •Compiler intrinsics Optimization Notice Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not uniqueto Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability,functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Pleaserefer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. Notice revision #20110804 SSSE3, SSE4.2 Vector size: 128 bit Data types: •8, 16, 32, 64 bit integer •32 and 64 bit float VL: 2, 4, 8, 16 X2 Y2 X2◦Y2 X1 Y1 X1◦Y1 X4 Y4 X4◦Y4 X3 Y3 X3◦Y3 127 0
  • 47. 47 GCC Flags ffast-math influence round-off of fparithmetic and so breaks strict IEEE compliance The other optimizations are totally safe Add -ftree-vectorizer-verbose to get a vectorizationreportNDK_TOOLCHAIN_VERSION:=4.8 or4.9 in Application.mk to use latest versionifeq($(TARGET_ARCH_ABI),x86) LOCAL_CFLAGS +=-ffast-math -mtune=atom -mssse3 -mfpmath=sseendififeq($(TARGET_ARCH_ABI),x86_64) LOCAL_CFLAGS +=-ffast-math -mtune=slm–msse4.2endif Optimization Notice Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not uniqueto Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability,functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Pleaserefer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. Notice revision #20110804
  • 48. 48 Android* Studio NDK support •Having .c(pp) sources inside jnifolder ? •ndk-build automatically called on a generated Android.mk, ignoring any existing .mk •All configuration done through build.gradle(moduleName, ldLibs, cFlags, stl) •You can change that to continue relying on your own Makefiles: http://ph0b.com/android-studio-gradle-and-ndk-integration/ •Having .so files to integrate ? •Copy them to jniLibs/ABI folders or integrate them from a .aarlibrary •Use APK splits to generate one APK per arch with a computed versionCode http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
  • 50. 51 Some last comments •In Application.mk, ANDROID_PLATFORM must be the same as your minSdkLevel. This is especially important with Android-L. •With Android L (ART), JNI is more strict than before: •pay attention to objects and JNIEnvreferences, threads and methods mapping
  • 51. 57 Multiple Code Paths Compiler macros #ifdef__i386__ strlcat(buf, "i386", sizeof(buf)); #endif #ifdef__arm__ strlcat(buf, "arm", sizeof(buf)); #endif #ifdef__mips__ strlcat(buf, "mips", sizeof(buf)); #endif #ifdef__x86_64__ strlcat(buf, “x86_64", sizeof(buf)); #endif #ifdef__aarch64__ strlcat(buf, “arm64", sizeof(buf)); #endif #ifdef__mips64 strlcat(buf, "mips64", sizeof(buf)); #endififeq($(TARGET_ARCH_ABI),x86) LOCAL_SRC_FILES += … endififeq($(TARGET_ARCH_ABI),x86_64) LOCAL_SRC_FILES += … endif … Makefileconditions
  • 52. 60 Analyzing what is getting installed on a devicehttps://play.google.com/store/apps/details?id= com.xh.nativelibsmonitor.app