SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
Android NDK, или как я
перестал бояться и полюбил
нативную разработку.
Android NDK.
• JNI - набор инструментов для запуска кода на C/
C++/Ассемблере из виртуальной машины Java
• Вспомогательная нативная
библиотека(скомпилированная для каждой
поддерживаемой ABI) или полностью нативное
приложение используя NativeActivity
• Java -> нативный код, нативный код -> Java, Java
-> нативный код -> Java…
Зачем?
• Критичные по производительности участки кода
• Использование написанного ранее кода или
существующих библиотек (OpenCV, ffmpeg, …)
• Написание кроссплатформенного кода для
нескольких платформ(бизнес-логика, алгоритмы
и тд)
Какие возникают
сложности?
• Работа с jni из нативных потоков
• Отладка
• Возрастающий размер результирующей apk
• Локальные/глобальные ссылки
• Дорогой переход из java кода в нативный
(и обратно)
• Прочие приятные сюрпризы от jni)
Базовый пример.
public class IntegrationActivity extends AppCompatActivity

{

…

@Override

protected void onCreate(Bundle savedInstanceState)

{

…

textView.setText("Value from native code: " + nativeGetBooleanValue());

}

public native boolean nativeGetBooleanValue();

static {

System.loadLibrary("ndk_integration");

}

}
#include <jni.h>

#include "SomeCppClass.hpp"



extern "C"

{



JNIEXPORT jboolean JNICALL

Java_my_test_integration_IntegrationActivity_nativeGetBooleanValue(JNIEnv *env, jobject instance) {

SomeCppClass object;

return (jboolean) object.getSomeValue();

}



} // extern "C"
Java
C++
Типы данных JNI.
#ifdef HAVE_INTTYPES_H

# include <inttypes.h> /* C99 */

typedef uint8_t jboolean; /* unsigned 8 bits
*/

typedef int8_t jbyte; /* signed 8 bits */

typedef uint16_t jchar; /* unsigned 16 bits
*/

typedef int16_t jshort; /* signed 16 bits */

typedef int32_t jint; /* signed 32 bits */

typedef int64_t jlong; /* signed 64 bits */

typedef float jfloat; /* 32-bit IEEE 754
*/

typedef double jdouble; /* 64-bit IEEE 754
*/

#else

typedef unsigned char jboolean; /* unsigned 8 bits
*/

typedef signed char jbyte; /* signed 8 bits */

typedef unsigned short jchar; /* unsigned 16 bits
*/

typedef short jshort; /* signed 16 bits */

typedef int jint; /* signed 32 bits */

typedef long long jlong; /* signed 64 bits */

typedef float jfloat; /* 32-bit IEEE 754
*/

typedef double jdouble; /* 64-bit IEEE 754
*/

#endif
typedef void* jobject;

typedef jobject jclass;

typedef jobject jstring;

typedef jobject jarray;

typedef jarray jobjectArray;

typedef jarray jbooleanArray;

typedef jarray jbyteArray;

typedef jarray jcharArray;

typedef jarray jshortArray;

typedef jarray jintArray;

typedef jarray jlongArray;

typedef jarray jfloatArray;

typedef jarray jdoubleArray;

typedef jobject jthrowable;

typedef jobject jweak;
Примитивные Ссылочный
JNIEnv и функции
JNI.
• JNIEnv
• IsSameObject, Call*Method, Get*Field, Set*Field,
New*Array…
• NewGlobalRef, DeleteGlobalRef, DeleteLocalRef
• AttachCurrentThread, DetachCurrentThread
• JNI_OnLoad, JNI_OnUnload
Локальные и глобальные
ссылки.
• Объекты, на которые есть ссылки - не могут быть очищены
GC
• Локальные ссылки - в пределах жизни метода в рамках
одного потока
• Java VM автоматически очищает ссылки при возврате из
нативного метода
• Есть предел на количество создаваемых локальных ссылок
• Глобальные ссылки действительны вплоть до явного
освобождения
Таблица локальных и
глобальных ссылок.
void DumpDalvikReferenceTables()

{

JNIEnv * env = jni::GetEnv();

jclass vm_class = env->FindClass("dalvik/system/VMDebug");

jmethodID dump_mid = env->GetStaticMethodID(vm_class,
"dumpReferenceTables", "()V");

env->CallStaticVoidMethod(vm_class, dump_mid);

env->DeleteLocalRef(vm_class);

}
Нативные потоки.
• AttachCurrentThread для работы с jni
• DetachCurrentThread перед завершением
• Локальные ссылки НЕ очищаются - нужно
всегда(!) очищать все созданные ссылки с
помощью DeleteLocalRef либо создавать
отдельный пул ссылок при входе в метод через
PushLocalFrame/PopLocalFrame
• FindClass НЕ работает
Нативные потоки.
FindClass.
• Простой вариант решения - кешировать класс в
JNI_OnLoad.
• Более сложный, но гибкий - кешировать сам
ClassLoader.
Кеширование ClassLoader.
JNIEXPORT jint JNICALL

JNI_OnLoad(JavaVM *jvm, void *) {

g_jvm = jvm;



JNIEnv *env = jni::GetEnv();

auto randomClass = env->FindClass("my/test/integration/IntegrationActivity");

auto classClass = env->GetObjectClass(randomClass);

auto classLoaderClass = env->FindClass("java/lang/ClassLoader");

auto getClassLoaderMethod = env->GetMethodID(classClass, "getClassLoader",

"()Ljava/lang/ClassLoader;");

g_classLoader = env->NewGlobalRef(env->CallObjectMethod(randomClass, getClassLoaderMethod));

g_findClassMethod = env->GetMethodID(classLoaderClass, "findClass",

"(Ljava/lang/String;)Ljava/lang/Class;");



return JNI_VERSION_1_6;
Кеширование jClass,
jMethodId, jFieldId.• jClass -локальные ссылки, для кеширования
необходимо преобразовывать в глобальные.
• jMethodId, jFieldId - просто структуры, можно
записывать без преобразования в статические
или глобальные переменные и использовать в
любых потоках.
Кеширование jClass,
jMethodId, jFieldId.• jClass -локальные ссылки, для кеширования
необходимо преобразовывать в глобальные.
• jMethodId, jFieldId - просто структуры, можно
записывать без преобразования в статические
или глобальные переменные и использовать в
любых потоках.
• В некоторых случаях работа через jni может быть
ЗНАЧИТЕЛЬНО медленнее аналогичного кода на
Java.
Запуск native метода из
Java.
• Создать новый стекфрейм
• Передать аргументы согласно ABI
• Передать JNIEnv* и jclass(jobject)
• Synchronized
• Проверить исключения
• …
Сборка проекта. Как было
раньше.
• MAKEFILES
• Javah
• SWIG
• Ecplise plugin Sequoyah
• …
New experimental Gradle
plugin.
Раз.
Два.
Три.
Download and enjoy!
https://goo.gl/yn4ZmC
More info.
• http://developer.android.com/training/articles/perf-jni.html
• https://developer.android.com/ndk/guides/concepts.html
• http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/
design.html
• http://tools.android.com/tech-docs/new-build-system/gradle-experimental
• http://normanmaurer.me/blog/2014/01/07/JNI-Performance-Welcome-to-
the-dark-side/
• http://compmus.ime.usp.br/sbcm/2013/pt/docs/pos_tec_4.pdf
• http://janet-project.sourceforge.net/papers/jnibench.pdf

Weitere ähnliche Inhalte

Was ist angesagt?

Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииNikita Lipsky
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Ontico
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.Igor Shkulipa
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionNikita Lipsky
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM LevelNikita Lipsky
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел СычевYandex
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernelsDenis Efremov
 
Инструменты тестирования ядра Linux
Инструменты тестирования ядра LinuxИнструменты тестирования ядра Linux
Инструменты тестирования ядра LinuxDenis Efremov
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора SwiftAndrey Volobuev
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaNikita Lipsky
 
Valentin Simonov “Who cracks our games and how that is done”
Valentin Simonov “Who cracks our games and how that is done”Valentin Simonov “Who cracks our games and how that is done”
Valentin Simonov “Who cracks our games and how that is done”DevGAMM Conference
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Справка-обзор популярных робототехнических комплектов
Справка-обзор популярных робототехнических комплектовСправка-обзор популярных робототехнических комплектов
Справка-обзор популярных робототехнических комплектовAlexander Kolotov
 

Was ist angesagt? (20)

Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомии
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM Level
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 
Инструменты тестирования ядра Linux
Инструменты тестирования ядра LinuxИнструменты тестирования ядра Linux
Инструменты тестирования ядра Linux
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора Swift
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на Java
 
Valentin Simonov “Who cracks our games and how that is done”
Valentin Simonov “Who cracks our games and how that is done”Valentin Simonov “Who cracks our games and how that is done”
Valentin Simonov “Who cracks our games and how that is done”
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Справка-обзор популярных робототехнических комплектов
Справка-обзор популярных робототехнических комплектовСправка-обзор популярных робототехнических комплектов
Справка-обзор популярных робототехнических комплектов
 

Ähnlich wie Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную разработку».

Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Mail.ru Group
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Alexey Fyodorov
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходPositive Hack Days
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действииNikita Lipsky
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)
Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)
Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)Ontico
 

Ähnlich wie Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную разработку». (20)

Bytecode
BytecodeBytecode
Bytecode
 
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
Native Development
Native DevelopmentNative Development
Native Development
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обход
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)
Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)
Успешный кейс использования React Native в продакшне, Евгений Федоров (LOOKBUCK)
 
JPHP
JPHPJPHP
JPHP
 

Mehr von Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинMail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовMail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidiaMail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоMail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковMail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковMail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиMail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Mail.ru Group
 

Mehr von Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную разработку».

  • 1. Android NDK, или как я перестал бояться и полюбил нативную разработку.
  • 2. Android NDK. • JNI - набор инструментов для запуска кода на C/ C++/Ассемблере из виртуальной машины Java • Вспомогательная нативная библиотека(скомпилированная для каждой поддерживаемой ABI) или полностью нативное приложение используя NativeActivity • Java -> нативный код, нативный код -> Java, Java -> нативный код -> Java…
  • 3. Зачем? • Критичные по производительности участки кода • Использование написанного ранее кода или существующих библиотек (OpenCV, ffmpeg, …) • Написание кроссплатформенного кода для нескольких платформ(бизнес-логика, алгоритмы и тд)
  • 4. Какие возникают сложности? • Работа с jni из нативных потоков • Отладка • Возрастающий размер результирующей apk • Локальные/глобальные ссылки • Дорогой переход из java кода в нативный (и обратно) • Прочие приятные сюрпризы от jni)
  • 5. Базовый пример. public class IntegrationActivity extends AppCompatActivity
 {
 …
 @Override
 protected void onCreate(Bundle savedInstanceState)
 {
 …
 textView.setText("Value from native code: " + nativeGetBooleanValue());
 }
 public native boolean nativeGetBooleanValue();
 static {
 System.loadLibrary("ndk_integration");
 }
 } #include <jni.h>
 #include "SomeCppClass.hpp"
 
 extern "C"
 {
 
 JNIEXPORT jboolean JNICALL
 Java_my_test_integration_IntegrationActivity_nativeGetBooleanValue(JNIEnv *env, jobject instance) {
 SomeCppClass object;
 return (jboolean) object.getSomeValue();
 }
 
 } // extern "C" Java C++
  • 6. Типы данных JNI. #ifdef HAVE_INTTYPES_H
 # include <inttypes.h> /* C99 */
 typedef uint8_t jboolean; /* unsigned 8 bits */
 typedef int8_t jbyte; /* signed 8 bits */
 typedef uint16_t jchar; /* unsigned 16 bits */
 typedef int16_t jshort; /* signed 16 bits */
 typedef int32_t jint; /* signed 32 bits */
 typedef int64_t jlong; /* signed 64 bits */
 typedef float jfloat; /* 32-bit IEEE 754 */
 typedef double jdouble; /* 64-bit IEEE 754 */
 #else
 typedef unsigned char jboolean; /* unsigned 8 bits */
 typedef signed char jbyte; /* signed 8 bits */
 typedef unsigned short jchar; /* unsigned 16 bits */
 typedef short jshort; /* signed 16 bits */
 typedef int jint; /* signed 32 bits */
 typedef long long jlong; /* signed 64 bits */
 typedef float jfloat; /* 32-bit IEEE 754 */
 typedef double jdouble; /* 64-bit IEEE 754 */
 #endif typedef void* jobject;
 typedef jobject jclass;
 typedef jobject jstring;
 typedef jobject jarray;
 typedef jarray jobjectArray;
 typedef jarray jbooleanArray;
 typedef jarray jbyteArray;
 typedef jarray jcharArray;
 typedef jarray jshortArray;
 typedef jarray jintArray;
 typedef jarray jlongArray;
 typedef jarray jfloatArray;
 typedef jarray jdoubleArray;
 typedef jobject jthrowable;
 typedef jobject jweak; Примитивные Ссылочный
  • 7. JNIEnv и функции JNI. • JNIEnv • IsSameObject, Call*Method, Get*Field, Set*Field, New*Array… • NewGlobalRef, DeleteGlobalRef, DeleteLocalRef • AttachCurrentThread, DetachCurrentThread • JNI_OnLoad, JNI_OnUnload
  • 8. Локальные и глобальные ссылки. • Объекты, на которые есть ссылки - не могут быть очищены GC • Локальные ссылки - в пределах жизни метода в рамках одного потока • Java VM автоматически очищает ссылки при возврате из нативного метода • Есть предел на количество создаваемых локальных ссылок • Глобальные ссылки действительны вплоть до явного освобождения
  • 9. Таблица локальных и глобальных ссылок. void DumpDalvikReferenceTables()
 {
 JNIEnv * env = jni::GetEnv();
 jclass vm_class = env->FindClass("dalvik/system/VMDebug");
 jmethodID dump_mid = env->GetStaticMethodID(vm_class, "dumpReferenceTables", "()V");
 env->CallStaticVoidMethod(vm_class, dump_mid);
 env->DeleteLocalRef(vm_class);
 }
  • 10. Нативные потоки. • AttachCurrentThread для работы с jni • DetachCurrentThread перед завершением • Локальные ссылки НЕ очищаются - нужно всегда(!) очищать все созданные ссылки с помощью DeleteLocalRef либо создавать отдельный пул ссылок при входе в метод через PushLocalFrame/PopLocalFrame • FindClass НЕ работает
  • 11. Нативные потоки. FindClass. • Простой вариант решения - кешировать класс в JNI_OnLoad. • Более сложный, но гибкий - кешировать сам ClassLoader.
  • 12. Кеширование ClassLoader. JNIEXPORT jint JNICALL
 JNI_OnLoad(JavaVM *jvm, void *) {
 g_jvm = jvm;
 
 JNIEnv *env = jni::GetEnv();
 auto randomClass = env->FindClass("my/test/integration/IntegrationActivity");
 auto classClass = env->GetObjectClass(randomClass);
 auto classLoaderClass = env->FindClass("java/lang/ClassLoader");
 auto getClassLoaderMethod = env->GetMethodID(classClass, "getClassLoader",
 "()Ljava/lang/ClassLoader;");
 g_classLoader = env->NewGlobalRef(env->CallObjectMethod(randomClass, getClassLoaderMethod));
 g_findClassMethod = env->GetMethodID(classLoaderClass, "findClass",
 "(Ljava/lang/String;)Ljava/lang/Class;");
 
 return JNI_VERSION_1_6;
  • 13. Кеширование jClass, jMethodId, jFieldId.• jClass -локальные ссылки, для кеширования необходимо преобразовывать в глобальные. • jMethodId, jFieldId - просто структуры, можно записывать без преобразования в статические или глобальные переменные и использовать в любых потоках.
  • 14. Кеширование jClass, jMethodId, jFieldId.• jClass -локальные ссылки, для кеширования необходимо преобразовывать в глобальные. • jMethodId, jFieldId - просто структуры, можно записывать без преобразования в статические или глобальные переменные и использовать в любых потоках. • В некоторых случаях работа через jni может быть ЗНАЧИТЕЛЬНО медленнее аналогичного кода на Java.
  • 15. Запуск native метода из Java. • Создать новый стекфрейм • Передать аргументы согласно ABI • Передать JNIEnv* и jclass(jobject) • Synchronized • Проверить исключения • …
  • 16. Сборка проекта. Как было раньше. • MAKEFILES • Javah • SWIG • Ecplise plugin Sequoyah • …
  • 22. More info. • http://developer.android.com/training/articles/perf-jni.html • https://developer.android.com/ndk/guides/concepts.html • http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/ design.html • http://tools.android.com/tech-docs/new-build-system/gradle-experimental • http://normanmaurer.me/blog/2014/01/07/JNI-Performance-Welcome-to- the-dark-side/ • http://compmus.ime.usp.br/sbcm/2013/pt/docs/pos_tec_4.pdf • http://janet-project.sourceforge.net/papers/jnibench.pdf