SlideShare a Scribd company logo
Native DevelopmentAndroid
Для чего?Игры, в которых много графикиРесурсоемкие алгоритмы обработкиimage/audio processingПодключение библиотек на C/C++FAAC, LAME, FFMPEG…Выйти за пределы кучи в Java (≈24MB)android.os.Debug.getNativeHeapAllocatedSize()
ПодготовкаСкачать Android NDK (Revision 5b Jan 10)При распаковке zip избегайте путей с пробелами. (всегда и везде избегайте путей с пробелами)Добавить в PATH путь к распакованному NDKCygwin for Win (with gcc/make/smth else)gcc/make/smthelsefor *nix
NDKndk-build скрипт в корнеlib и include – либыи h-ники, которые можно подключитьsamples – примерыdocs - хелп
Native projectНаходится в папке jni в корне Android-проектаСодержит android.mk — make-файлы для ndk-build
Root Android.mkinclude$(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 \		AudioEncodingController.cpp \		AudioEncodingJni.cpp \		EncoderConfiguration.cpp \		LameEncoder.cpp	LOCAL_LDLIBS := -ldl -llog -lc	LOCAL_STATIC_LIBRARIES := faac lame 	LOCAL_C_INCLUDES := $(LOCAL_PATH)/../faac-1.28/include/ \$(LOCAL_PATH)/../lame-3.98.4/include/ \$(LOCAL_PATH)/../libogg-1.2.2/include/ogg/	include$(BUILD_SHARED_LIBRARY)requiredoptimizationrequireddependenciesgood stylerequired
Связка с 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>JNIEXPORTjbooleaninitialize(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 logshttp://code.google.com/p/android-ndk-stacktrace-analyzer/logcat from your android device, containing a stacktraceasm 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.asmUse the script by running:	python parse_stack.py <asm-file> <logcat-file>Output:
Спасибо за вниманиеПрезентацию подготовил Шауберт Александрshaubert.alexander@gmail.comСпециально для Android May Days 2011

More Related Content

PDF
Очередной скучный доклад про логгирование
PDF
Дмитрий Щадей "Зачем и как мы используем jsLint"
PDF
PVS-Studio в 2021 - Примеры ошибок
PDF
Devcamp nodejs-2010
PDF
Component Inspector
PPTX
Tdd webpack + testem + mocha + chai
PPTX
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
ODP
Программирование Linux
Очередной скучный доклад про логгирование
Дмитрий Щадей "Зачем и как мы используем jsLint"
PVS-Studio в 2021 - Примеры ошибок
Devcamp nodejs-2010
Component Inspector
Tdd webpack + testem + mocha + chai
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
Программирование Linux

What's hot (20)

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

Similar to Native Development (20)

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

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 путь к распакованному NDKCygwin for Win (with gcc/make/smth else)gcc/make/smthelsefor *nix
  • 4. NDKndk-build скрипт в корнеlib и include – либыи h-ники, которые можно подключитьsamples – примерыdocs - хелп
  • 5. Native projectНаходится в папке jni в корне Android-проектаСодержит android.mk — make-файлы для ndk-build
  • 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 \ AudioEncodingController.cpp \ AudioEncodingJni.cpp \ EncoderConfiguration.cpp \ LameEncoder.cpp LOCAL_LDLIBS := -ldl -llog -lc LOCAL_STATIC_LIBRARIES := faac lame LOCAL_C_INCLUDES := $(LOCAL_PATH)/../faac-1.28/include/ \$(LOCAL_PATH)/../lame-3.98.4/include/ \$(LOCAL_PATH)/../libogg-1.2.2/include/ogg/ include$(BUILD_SHARED_LIBRARY)requiredoptimizationrequireddependenciesgood stylerequired
  • 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>JNIEXPORTjbooleaninitialize(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 logshttp://code.google.com/p/android-ndk-stacktrace-analyzer/logcat from your android device, containing a stacktraceasm 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.asmUse 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

  • #3: http://blog.javia.org/how-to-work-around-androids-24-mb-memory-limit/
  • #17: http://bootloader.wikidot.com/linux:android:crashlog