46
Intel Developers Relations Division android ndk: Entering the native world Eduardo Carrara Developer Evangelist – Intel @DuCarrara +EduardoCarraraDeAraujo

Android ndk: Entering the native world

Embed Size (px)

Citation preview

Page 2: Android ndk: Entering the native world

Intel Developers Relations Division 2

Agenda

The Android NDK

Are you using and is not aware?

Be careful with the Binary Interface

Starting with Android Studio + gradle-experimental

Questions?

Page 3: Android ndk: Entering the native world

Intel Developers Relations Division

Android ndkThe Native Development Kit

Page 4: Android ndk: Entering the native world

Intel Developers Relations Division 4

“The Android NDK is a set of tools that allows the

implementation of parts of your app using native code

languages like C and C++."

- NDK Android Developers Portal

Page 5: Android ndk: Entering the native world

Intel Developers Relations Division 5

and maybe you are doing that already...

... let’s a few interesting NDK usages.

Page 6: Android ndk: Entering the native world

Intel Developers Relations Division

Usages of NDKWhat can we do with it?

Page 7: Android ndk: Entering the native world

Intel Developers Relations Division 7

Game Engines

Others+…

*Other names and brands may be claimed as the property of others.

Page 8: Android ndk: Entering the native world

Intel Developers Relations Division 8

Computer Vision

• Linear and Non-Linear image filtering.

• Images Geometric Transformations.

• Moviments Prediction in Videos.

• Background segmentation on Videos.

• Object Tracking.

• ...

Outras: Cardboard-SDK, Vuforia, Layar, LibCCV, Wikitude ...

OpenCV.org

*Other names and brands may be claimed as the property of others.

Page 9: Android ndk: Entering the native world

Intel Developers Relations Division 9

Cross Platform Development

*Other names and brands may be claimed as the property of others.

Page 10: Android ndk: Entering the native world

Intel Developers Relations Division 10

Other Usages and Libraries

Realm

Swift

Libpng

Intel TBB

Intel IPP

Libcairo and libpixman

Libsonic

Busybox

Speex

FFMpeg

OpenSSL

Lua

...

*Other names and brands may be claimed as the property of others.

Page 11: Android ndk: Entering the native world

Intel Developers Relations Division 11

So many interesting usages!

Can we use NDK for

everything?!

Page 12: Android ndk: Entering the native world

Intel Developers Relations Division

Understanding the ndk

Page 13: Android ndk: Entering the native world

Intel Developers Relations Division

Source: Using the NDK Performantly (Big Android BBQ 2015)

15

Architecture Overview

App Code

Framework Classes

Runtime

System Libraries

Linux Kernel

JNI

Your Libraries

Stable ABI

Page 14: Android ndk: Entering the native world

Intel Developers Relations Division 16

In practice...

Microchip Icon – Icon Finder.

App00100111000011100111

x86

ARM

MIPS

Your code is:

• Closer to HW

• Platform Dependent

You must be careful about it!

Page 15: Android ndk: Entering the native world

Intel Developers Relations Division 17

You APK X-Ray with NDK usage

Page 16: Android ndk: Entering the native world

Intel Developers Relations Division 18

3 Golden Rules for NDK Adoption

1

2

3 Legacy Code that must be re-used and/or to expensive to port to Java*.

Specific performance problems.

Features and Experiences that demand performance.

Page 17: Android ndk: Entering the native world

Intel Developers Relations Division 19

3 (Main) Barriers for NDK Adoption

1

2

3 Perfomance gains are not assured.

Complexity of Implementation and Maintenance.

Platform Dependency and Compatibility.

Page 18: Android ndk: Entering the native world

Intel Developers Relations Division 20

We can, but we should not use NDK for everything.

So...

Still interested?

Take the “red pill” and we will show you how far this

can go...

Page 19: Android ndk: Entering the native world

Intel Developers Relations Division

using the ndk

Page 20: Android ndk: Entering the native world

Intel Developers Relations Division 22

Fundamentals: Java Native Interface (JNI)

Defines how Java and native code will interop.

Java C / C++

• Load lib with:

• System.loadLibrary()

• Definition of Native Methods:

• Reserved word native

• Include the JNI Header:• #include <jni.h>

• Use specific JNI data types:• jstring, jint, jboolean, etc.

• Special Variables:• JNIEnv*, JavaVM*

Page 21: Android ndk: Entering the native world

Intel Developers Relations Division 23

JNI: Mapping Java Methods To C / C++

In C/C++ the function must:

Use and return Java JNI primitives and Objects:

Follows the naming standards:

Or register functions manually:

jint xxx(JNIEnv* env, jobject instance, ...) { ... }

Java_com_example_hellojni_HelloWorldJni_method

JNIEnv->RegisterNatives();

Page 22: Android ndk: Entering the native world

Intel Developers Relations Division 24

JNI: Example

Java

C / C++

public class HelloWorldJNI {

static {

System.loadLibrary("hello-jni");

}

public native String getHelloWorldStringFromJNI();

}

#include <jni.h>

jstring

Java_com_example_hellojni_HelloWorldJNI_getHelloWorldStringFromJNI(JNIEnv *env, jobject instance) {

return (*env)->NewStringUTF(env, "Hello World!");

}

Page 23: Android ndk: Entering the native world

Intel Developers Relations Division 25

Old but Gold

Building NDK Apps classic style.J

NI

Co

de

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni

LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

APP_ABI := all

jni/Android.mk jni/Application.mk

Page 24: Android ndk: Entering the native world

Intel Developers Relations Division 26

Old but Gold

ndk_build script

Building NDK Apps classic style.

Page 25: Android ndk: Entering the native world

Intel Developers Relations Division 27

Old but Gold

Building NDK Apps (almost) classic style.

• Add libs to jniLibs directory.

• Create java – jni interfaces.

• For libs pre-builts that is all.

• To build from source is a bit more complicated but is possible as well..

Page 26: Android ndk: Entering the native world

Intel Developers Relations Division 28

Limitations

• Debug is not possible on AS. It is necessary to use ndk-gdb and/or Eclipse.

• Current support of gradle plugin was deprecated (ouch).

Page 27: Android ndk: Entering the native world

Intel Developers Relations Division 29

... So where do we go?

Page 28: Android ndk: Entering the native world

Intel Developers Relations Division

Android studio + ndk + gradle-experimental

Page 29: Android ndk: Entering the native world

Intel Developers Relations Division 31

Important Warnings

• The experimental version of android gradle plugin will be used.

• Integration with Android Studio was improved but it stills unstable and has some bugs.

• On Windows there are issues with the Editor and/or build that prevent its usage. (Issues 195483 and 204552).

• Documentation is virtually inexistent or incomplete.

Page 30: Android ndk: Entering the native world

Intel Developers Relations Division 32

AS Integration

NDK Installation

and Configuration

are now integrated

to Android Studio.

Page 31: Android ndk: Entering the native world

Intel Developers Relations Division 33

AS Integration

Page 32: Android ndk: Entering the native world

Intel Developers Relations Division 34

AS Integration

Page 33: Android ndk: Entering the native world

Intel Developers Relations Division 35

gradle-experimental

Configuration

distributionUrl=https\://services

.gradle.org/distributions/gradle-

2.10-all.zip

./build.gradle ./gradle/gradle-wrapper/gradle-wrapper.properties

dependencies {

classpath

'com.android.tools.build:gradle-

experimental:0.7.0'

}

Page 34: Android ndk: Entering the native world

Intel Developers Relations Division 36

gradle-experimental

Configuration: Combining Versions

Android Studio 1.5 2.0 2.1

gradle 2.8 2.10 2.10

gradle plugin 1.5.0 2.0.0 2.1.0

gradle-experimental plugin 0.4.0 0.6.0 0.7.0

Page 35: Android ndk: Entering the native world

Intel Developers Relations Division 37

gradle-experimental

Configuration: build.gradle DSL

changes.

Always Check:

- NDK Samples

- gradle-experimental docs

apply plugin: 'com.android.model.application'

model {

}

android {

compileSdkVersion = 23

buildToolsVersion = "23.0.3"

defaultConfig.with {

applicationId = "com.example.hellojni"

minSdkVersion.apiLevel = 4

targetSdkVersion.apiLevel = 23

}

}

android.ndk {

moduleName = "hello-jni"

}

android.buildTypes {

release {

minifyEnabled = false

proguardFiles.add(file('proguard-rules.txt'))

}

}

Page 36: Android ndk: Entering the native world

Intel Developers Relations Division 38

gradle-experimental

Configuration: multiple apks.

apply plugin: 'com.android.model.application'

model {

}

android.productFlavors {

}

// … standard gradle stuff

// … other gradle stuff

create ("armv7") {

}

create (“x86") {

}

ndk.abiFilters.add("armeabi-v7a")

ndk.abiFilters.add(“x86")

versionCode = calculateVersionCodeFor(

"armeabi-v7a")

versionCode = calculateVersionCodeFor(

“x86")

create (“fat")

Page 37: Android ndk: Entering the native world

Intel Developers Relations Division 39

gradle-experimental

Configuration: multiple apks.

apply plugin: 'com.android.model.application'

model {

}

def actualVersionCode = 13;

// … gradle stuff

// … other gradle stuff

def baseVersionCode = 1000000;

def versionCodeABIPrefixes = [

'armeabi':1, 'armeabi-v7a':2, 'arm64-v8a':3,

'mips': 5,'mips64': 6,

'x86': 8, 'x86_64': 9];

def calculateVersionCodeFor = { String abi ->

return versionCodeABIPrefixes.get(abi, 0) *

baseVersionCode + actualVersionCode

}

Page 38: Android ndk: Entering the native world

Intel Developers Relations Division 40

gradle-experimental

• It is also possible:

• Configure pre-built libs;

• Add build flags (general and by flavor);

• The current documentation generally do not follow the releases, then:

• Keep an eye to NDK Samples for references!

Page 39: Android ndk: Entering the native world

Intel Developers Relations Division 42

Final Thoughts

When using NDK, direct or inderectly,add support to as many platform architectures as possibles.

Use NDK wisely: test, create benchmarks and assure that it is the right solution to your problem.

Follow and test the gradle-experimental plugin for the NDK!

Page 40: Android ndk: Entering the native world

Intel Developers Relations Division

Questions?

Page 41: Android ndk: Entering the native world

Intel Developers Relations Division

References

Page 42: Android ndk: Entering the native world

Intel Developers Relations Division 47

References

• NDK Development on Intel

• Intel Tools

• Android* NDK Official Documentation

• Android* NDK Gradle Experimental Documentation

• Android* NDK Google* Samples

• Gradle Stable NDK Support - Xavier Hallade

• New Android Studio NDK Support - Xavier Hallade

Page 43: Android ndk: Entering the native world

Intel Developers Relations Division

thanks

Page 44: Android ndk: Entering the native world

Intel Developers Relations Division

Legal Notices and Disclaimers INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL® PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL

PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL’S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER, AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL® PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT. INTEL PRODUCTS ARE NOT INTENDED FOR USE IN MEDICAL, LIFE SAVING, OR LIFE SUSTAINING APPLICATIONS.

Intel may make changes to specifications and product descriptions at any time, without notice. Products with an “L” or “T” in the Price Point reference (e.g. U-L1, YT3, etc.) may be discontinued by Intel at any time without an end of life announcement or “last time buy” opportunity.

All products, dates, and figures specified are preliminary based on current expectations, and are subject to change without notice.

Intel, processors, chipsets, and desktop boards may contain design defects or errors known as errata, which may cause the product to deviate from published specifications. Current characterized errata are available on request.

Any code names featured are used internally within Intel to identify products that are in development and not yet publicly announced for release. Customers, licensees and other third parties are not authorized by Intel to use code names in advertising, promotion or marketing of any product or services and any such use of Intel's internal code names is at the sole risk of the user.

Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors. Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products. For more information go to http://www.intel.com/performance

Intel, Intel Inside, the Intel logo, Centrino, Centrino Inside, Intel Core, Intel Atom and Pentium are trademarks of Intel Corporation in the United States and other countries.

Material in this presentation is intended as product positioning and not approved end user messaging.

This document contains information on products in the design phase of development.

*Other names and brands may be claimed as the property of others.

Copyright © 2016 Intel Corporation.

Page 45: Android ndk: Entering the native world

Intel Developers Relations Division

Security features enabled by Intel® AMT require an enabled chipset, network hardware and software and a corporate network connection. Intel AMT may not be available or certain capabilities may be limited over a host OS-based VPN or when connecting wirelessly, on battery power, sleeping, hibernating or powered off. Setup requires configuration and may require scripting with the management console or further integration into existing security frameworks, and modifications or implementation of new business processes. For more information, see http://www.intel.com/technology/manage/iamt.

WiMAX connectivity requires a WiMAX enabled device and subscription to a WiMAX broadband service. WiMAX connectivity may require you to purchase additional software or hardware at extra cost. Availability of WiMAX is limited, check with your service provider for details on availability and network limitations. Broadband performance and results may vary due to environment factors and other variables. See www.intel.com/go/wimax for more information.

Intel® My WiFi Technology is an optional feature and requires additional software and a Centrino® wireless adapter. Wi-Fi devices must be certified by the Wi-Fi Alliance for 802.11b/g/a in order to connect. See mywifi.intel.com for more details.

Hyper-Threading Technology requires a computer system with a processor supporting HT Technology and an HT Technology-enabled chipset, BIOS and operating system. Performance will vary depending on the specific hardware and software you use. For more information including details on which processors support HT Technology, see here

No system can provide absolute security under all conditions. Requires an enabled chipset, BIOS, firmware and software and a subscription with a capable Service Provider. Consult your system manufacturer and Service Provider for availability and functionality. Intel assumes no liability for lost or stolen data and/or systems or any other damages resulting thereof. For more information, visit http://www.intel.com/go/anti-theft Intel® Turbo Boost Technology requires a PC with a processor with Intel Turbo Boost Technology capability. Intel Turbo Boost Technology performance varies depending on hardware, software and overall system configuration. Check with your PC manufacturer on whether your system delivers Intel Turbo Boost Technology. For more information, see http://www.intel.com/technology/turboboost

Requires an Intel® Wireless Display enabled PC, TV Adapter, and compatible television. Available on select Intel® Core processors. Does not support Blu-Ray or other protected content playback. Consult your PC manufacturer. For more information, see www.intel.com/go/wirelessdisplay

(Built-in Visuals) Available on the 2nd gen Intel® Core™ processor family. Includes Intel® HD Graphics, Intel® Quick Sync Video, Intel® Clear Video HD Technology, Intel® InTru™ 3D Technology, and Intel® Advanced Vector Extensions. Also optionally includes Intel® Wireless Display depending on whether enabled on a given system or not. Whether you will receive the benefits of built-in visuals depends upon the particular design of the PC you choose. Consult your PC manufacturer whether built-in visuals are enabled on your system. Learn more about built-in visuals at http://www.intel.com/technology/visualtechnology/index.htm.

Legal Notices and Disclaimers, cont.

Page 46: Android ndk: Entering the native world

Intel Developers Relations Division