SlideShare a Scribd company logo
1 of 17
Native Development Android
Для чего? Игры, в которых много графики Ресурсоемкие алгоритмы обработки image/audio processing Подключение библиотек на C/C++ FAAC, LAME, FFMPEG… Выйти за пределы кучи в Java (≈24MB) android.os.Debug.getNativeHeapAllocatedSize()
Подготовка Скачать Android NDK (Revision 5b Jan 10) При распаковке zip избегайте путей с пробелами. (всегда и везде избегайте путей с пробелами) Добавить в PATH путь к распакованному NDK Cygwin for Win (with gcc/make/smth else) gcc/make/smthelsefor *nix
NDK ndk-build скрипт в корне lib и include – либыи h-ники, которые можно подключить samples – примеры docs - хелп
Native project Находится в папке jni в корне Android-проекта Содержит android.mk — make-файлы для ndk-build
Root Android.mk include$(call all-subdir-makefiles)
Single project’s Android.mk 	LOCAL_PATH := $(call my-dir) 	include$(CLEAR_VARS) 	LOCAL_ARM_MODE := arm 	LOCAL_CFLAGS := $(LOCAL_CFLAGS) -O3 	LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS) -O3 	LOCAL_MODULE    := core 	LOCAL_SRC_FILES := AacEncoder.cpp br />		AudioEncodingController.cpp br />		AudioEncodingJni.cpp br />		EncoderConfiguration.cpp br />		LameEncoder.cpp 	LOCAL_LDLIBS := -ldl -llog -lc 	LOCAL_STATIC_LIBRARIES := faac lame  	LOCAL_C_INCLUDES := $(LOCAL_PATH)/../faac-1.28/include/ br />$(LOCAL_PATH)/../lame-3.98.4/include/ br />$(LOCAL_PATH)/../libogg-1.2.2/include/ogg/ 	include$(BUILD_SHARED_LIBRARY) required optimization required dependencies good style required
Связка с Java-кодом (JNI) Хороший стиль — хранить нативные вызовы в отдельном классе publicclassAudioCoreJNI { static {         System.loadLibrary("core"); Log.d(AudioCoreJNI.class.getSimpleName(), "library loaded"); }     ... privatenativevoidnativeSetLogging(boolean on); privatenativebooleannativeInitialize(int[] configuration); privatenativeintnativeGetOutputBufferSize(intsamplesCount);    privatenativebyte[] nativeFlush(); privatenativevoidnativeClose(); }
Связка с Java-кодом (JNI) #include<jni.h> JNIEXPORT jbooleaninitialize(JNIEnv* env, jobjectthiz, 	jintArray configuration) { voidJava_com_example_nativeaudio_NativeAudio_createEngine	(JNIEnv* env, jclassclazz){
OnLoad() JNINativeMethod methods[] = { {"nativeInitialize", "([I)Z", (bool*)initialize }, {"nativeEncode", "([BII[B)I", (void*)encode}}; intjniRegisterNativeMethods(JNIEnv* env, constchar* className, constJNINativeMethod* 	gMethods, intnumMethods) { jclassclazz; clazz = env->FindClass("com/shaubert/android/aaf/jni/AudioCoreJNI"); if (clazz != NULL) {   if (env->RegisterNatives(clazz, gMethods, 2) >= 0) {     return 0;   }     }  return -1; } jintJNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK) {  if (jniRegisterNativeMethods(env, classPathName, methods, 2) > 0) {     return JNI_VERSION_1_4;  }     } return -1; }
Native logging #include<android/log.h> #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, “LOG_TAG", __VA_ARGS__) if (logging) {     LOGD(“test logging %s %d...“, “hello”); }
Compiling
Compiling
Running Android project
Fixing, Compiling, Running
Reading crash logs http://code.google.com/p/android-ndk-stacktrace-analyzer/ logcat from your android device, containing a stacktrace asm file of the library being debugged. You generate this file by using the NDK's objdumptool: 	...android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/…/ 	arm-eabi-objdump-S mylib.so >mylib.asm Use the script by running: 	python parse_stack.py <asm-file> <logcat-file> Output:
Спасибо за внимание Презентацию подготовил  Шауберт Александрshaubert.alexander@gmail.com Специально для Android May Days 2011

More Related Content

What's hot

Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищиCUSTIS
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Yandex
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupTimophy Chaptykov
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиГлеб Тарасов
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JSFestUA
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoDrupalCampDN
 

What's hot (20)

Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Bytecode
BytecodeBytecode
Bytecode
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Collider
ColliderCollider
Collider
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать Makeup
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Javascript
JavascriptJavascript
Javascript
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
 
Caching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander ShumenkoCaching on highload Drupal site - Alexander Shumenko
Caching on highload Drupal site - Alexander Shumenko
 

Similar to Native Development

Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Mail.ru Group
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Anton Arhipov
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
Unity Android и Java. Демо сессия
Unity Android и Java. Демо сессияUnity Android и Java. Демо сессия
Unity Android и Java. Демо сессияDevGAMM Conference
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
 
Разработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, ShturmannРазработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, Shturmannyaevents
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Plugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build systemPlugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build systemAnton Rutkevich
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb SpockBohdan Danyliuk
 
SWIFT нужен ли он вам?
SWIFT нужен ли он вам?SWIFT нужен ли он вам?
SWIFT нужен ли он вам?Improve Group
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 

Similar to Native Development (20)

New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Unity Android и Java. Демо сессия
Unity Android и Java. Демо сессияUnity Android и Java. Демо сессия
Unity Android и Java. Демо сессия
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
Разработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, ShturmannРазработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, Shturmann
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Gwt jug basic
Gwt jug basicGwt jug basic
Gwt jug basic
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Plugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build systemPlugin for plugin, or extending android new build system
Plugin for plugin, or extending android new build system
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
 
SWIFT нужен ли он вам?
SWIFT нужен ли он вам?SWIFT нужен ли он вам?
SWIFT нужен ли он вам?
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 

Native Development

  • 2. Для чего? Игры, в которых много графики Ресурсоемкие алгоритмы обработки image/audio processing Подключение библиотек на C/C++ FAAC, LAME, FFMPEG… Выйти за пределы кучи в Java (≈24MB) android.os.Debug.getNativeHeapAllocatedSize()
  • 3. Подготовка Скачать Android NDK (Revision 5b Jan 10) При распаковке zip избегайте путей с пробелами. (всегда и везде избегайте путей с пробелами) Добавить в PATH путь к распакованному NDK Cygwin for Win (with gcc/make/smth else) gcc/make/smthelsefor *nix
  • 4. NDK ndk-build скрипт в корне lib и include – либыи h-ники, которые можно подключить samples – примеры docs - хелп
  • 5. Native project Находится в папке jni в корне Android-проекта Содержит android.mk — make-файлы для ndk-build
  • 6. Root Android.mk include$(call all-subdir-makefiles)
  • 7. Single project’s Android.mk LOCAL_PATH := $(call my-dir) include$(CLEAR_VARS) LOCAL_ARM_MODE := arm LOCAL_CFLAGS := $(LOCAL_CFLAGS) -O3 LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS) -O3 LOCAL_MODULE := core LOCAL_SRC_FILES := AacEncoder.cpp br /> AudioEncodingController.cpp br /> AudioEncodingJni.cpp br /> EncoderConfiguration.cpp br /> LameEncoder.cpp LOCAL_LDLIBS := -ldl -llog -lc LOCAL_STATIC_LIBRARIES := faac lame LOCAL_C_INCLUDES := $(LOCAL_PATH)/../faac-1.28/include/ br />$(LOCAL_PATH)/../lame-3.98.4/include/ br />$(LOCAL_PATH)/../libogg-1.2.2/include/ogg/ include$(BUILD_SHARED_LIBRARY) required optimization required dependencies good style required
  • 8. Связка с Java-кодом (JNI) Хороший стиль — хранить нативные вызовы в отдельном классе publicclassAudioCoreJNI { static { System.loadLibrary("core"); Log.d(AudioCoreJNI.class.getSimpleName(), "library loaded"); } ... privatenativevoidnativeSetLogging(boolean on); privatenativebooleannativeInitialize(int[] configuration); privatenativeintnativeGetOutputBufferSize(intsamplesCount); privatenativebyte[] nativeFlush(); privatenativevoidnativeClose(); }
  • 9. Связка с Java-кодом (JNI) #include<jni.h> JNIEXPORT jbooleaninitialize(JNIEnv* env, jobjectthiz, jintArray configuration) { voidJava_com_example_nativeaudio_NativeAudio_createEngine (JNIEnv* env, jclassclazz){
  • 10. OnLoad() JNINativeMethod methods[] = { {"nativeInitialize", "([I)Z", (bool*)initialize }, {"nativeEncode", "([BII[B)I", (void*)encode}}; intjniRegisterNativeMethods(JNIEnv* env, constchar* className, constJNINativeMethod* gMethods, intnumMethods) { jclassclazz; clazz = env->FindClass("com/shaubert/android/aaf/jni/AudioCoreJNI"); if (clazz != NULL) { if (env->RegisterNatives(clazz, gMethods, 2) >= 0) { return 0; } } return -1; } jintJNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK) { if (jniRegisterNativeMethods(env, classPathName, methods, 2) > 0) { return JNI_VERSION_1_4; } } return -1; }
  • 11. Native logging #include<android/log.h> #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, “LOG_TAG", __VA_ARGS__) if (logging) { LOGD(“test logging %s %d...“, “hello”); }
  • 16. Reading crash logs http://code.google.com/p/android-ndk-stacktrace-analyzer/ logcat from your android device, containing a stacktrace asm file of the library being debugged. You generate this file by using the NDK's objdumptool: ...android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/…/ arm-eabi-objdump-S mylib.so >mylib.asm Use the script by running: python parse_stack.py <asm-file> <logcat-file> Output:
  • 17. Спасибо за внимание Презентацию подготовил Шауберт Александрshaubert.alexander@gmail.com Специально для Android May Days 2011

Editor's Notes

  1. http://blog.javia.org/how-to-work-around-androids-24-mb-memory-limit/
  2. http://bootloader.wikidot.com/linux:android:crashlog