Разработка приложений для Android на С++. Юрий Береза, Shturmann
Upcoming SlideShare
Loading in...5
×
 

Разработка приложений для Android на С++. Юрий Береза, Shturmann

on

  • 9,901 views

Юрий Береза, Shturmann...

Юрий Береза, Shturmann

Окончил факультет приборостроения Московской государственной академии приборостроения и информатики. В 2004 году пришел на работу в отдел мобильных разработок компании «Макцентр». Занимался разработкой под огромное число мобильных платформ: Windows Mobile, Symbian, Android, Embedded linux и iOS. В данный момент работает руководителем группы в компании «Контент Мастер», где занимается разработкой автомобильной навигации Shturmann.

Тема доклада
Разработка приложений для Android на С++.

Тезисы
Платформа Android становится популярнее с каждым годом. Несмотря на то, что основным языком разработки приложений для Android является Java, часто для написания кросс-платформенных приложений или при использовании сторонних библиотек программистам приходится использовать С или С++. К сожалению, разработка на С++ для платформы Android описана довольно скупо, и зачастую приходится тратить много времени на поиск нужной информации. В докладе будут представлены ответы на основные вопросы по всему циклу разработки: как писать С++ код, который будет работать на Android, как его отлаживать и находить ошибки во время падения приложений, есть ли возможность профилировать код и где искать дополнительную информацию по этим вопросам.

Statistics

Views

Total Views
9,901
Views on SlideShare
4,328
Embed Views
5,573

Actions

Likes
0
Downloads
17
Comments
0

14 Embeds 5,573

http://yac2011.yandex.ru 3277
http://yac2011.yandex.com 1234
http://events.yandex.ru 694
http://ya-events.narod.ru 208
http://tech.yandex.ru 103
https://tech.yandex.ru 24
http://events.lynx.yandex.ru 16
http://target122g.load.yandex.net 9
http://external.events.test.tools.yandex-team.ru 3
http://news.google.com 1
http://events.yandex-team.ru 1
http://web-chib.events.lacerta.yandex-team.ru 1
http://events.indus.yandex.ru 1
http://yac.tadatuta.graymantle.yandex.ru 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Разработка приложений для Android на С++. Юрий Береза, Shturmann Разработка приложений для Android на С++. Юрий Береза, Shturmann Presentation Transcript

  • Разработка приложений для Android на C++Берёза ЮрийпрограммистShturmannYaC, Москва, 19 сентября 2011 года 1
  • С чего начать• Linux• Java• Eclipse• C++• GCC• GDB• Android SDK 2
  • 3
  • 4
  • Что такое NDK? http://developer.android.com/sdk/ndk/index.html• Заголовочные файлы и библиотеки• GCC компилятор• Система сборки приложений• Набор дополнительных утилит 5
  • Создание проекта• Запустить Eclipse• Указать в настройках путь к SDK• Запустить мастер создания Android приложения 6
  • Sequoyah Android Native Code Support http://www.eclipse.org/sequoyah/ 7
  • Добавляем поддержку NDK 8
  • Application.mkAPP_MODULES := YaCAPP_CFLAGS := -DDEBUG -D__ANDROID__APP_OPTIM := debugAPP_STL := gnustl_staticAPP_ABI := armeabi armeabi-v7a 9
  • Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := YaCLOCAL_CFLAGS := -I$(LOCAL_PATH)/incLOCAL_SRC_FILES := YaC.cppLOCAL_LDLIBS := -lloginclude $(BUILD_SHARED_LIBRARY) 10
  • Поддержка расширенных инструкций NEONhttp://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html Anroid.mk ifeq ($TARGET_ARCH_ABI), armeabi-v7a) ! LOCAL_ARM_NEON := true ! LOCAL_ARM_MODE := arm endif 11
  • Или#include <cpu-features.h>void do_something(){ if ((android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() & ANDROID_CPU_FETURE_NEON)) { do_something_with_neon(); }} 12
  • JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 13
  • JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 14
  • JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 15
  • JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 16
  • JNIJava + /usr/bin/javah = C 17
  • JNI.C++JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv * env, jobject obj){ ...} 18
  • JNI.C++JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv * env, jobject obj){ ...} 19
  • JNIEnvJavaVM * gJVM = 0;JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){ gJVM = (*env)->GetJavaVM(env, &gJVM);}void someInternalFunction(){ JNIEnv * env = 0; (*gJVM)->AttachCurrentThread(gJVM, &env, 0);} 20
  • Локальные/глобальные ссылкиjclass * gYac = 0;JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv * env, jobject obj){ jclass yac = (*env)->GetObjectClass(env, obj); gYac = (*env)->NewGlobalRef(env, yac);} 21
  • JNIEnv::FindClassjclass gYac = 0;JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){ jclass yac = (*env)->FindClass(env, «com/shturmann/yac/YaCActivity»); gYac = (*env)->NewGlobalRef(env, yac);} 22
  • JNIEnv::ExceptionCheckJNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){ ... if ( !(*env)->ExceptionCheck(env) ) { ... }} 23
  • JNIEnv::PushLocalFrame/PopLocalFrameJNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){ (*env)->PushLocalFrame(env, 100500); ... (*env)->PopLocalFrame(env, NULL);} 24
  • JNIhttp://java.sun.com/docs/books/jni/download/jni.pdf 25
  • Дополнительные библиотеки• OpenGL ES 1.1 / OpenGL ES 2.0• OpenSL• C++ и wchar_t • http://www.crystax.net/ru/android/ndk• Boost • https://github.com/MysticTreeGames/Boost-for-Android• CURL 26
  • Запускаем сборку приложения• ndk-build• ant install 27
  • 28
  • Отладка Android 2.3 Gingerbred• ndk-gdb • Eclipse http://mitya.pp.ru/gdb/gdb_toc.html 29
  • Разбираемся с ошибками ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:user/release-keyspid: 7348, tid: 7348 >>> com.shturmann.yac <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),fault addr 00000000Stack frame #00 pc 00000716 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #01 pc 00000740 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #02 pc 00017e34 /system/lib/libdvm.soStack frame #03 pc 0004968c /system/lib/libdvm.soStack frame #04 pc 0004ee62 /system/lib/libdvm.so 30
  • Разбираемся с ошибками ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:user/release-keyspid: 7348, tid: 7348 >>> com.shturmann.yac <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),fault addr 00000000Stack frame #00 pc 00000716 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #01 pc 00000740 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #02 pc 00017e34 /system/lib/libdvm.soStack frame #03 pc 0004968c /system/lib/libdvm.soStack frame #04 pc 0004ee62 /system/lib/libdvm.so 31
  • Разбираемся с ошибками ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:user/release-keyspid: 7348, tid: 7348 >>> com.shturmann.yac <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),fault addr 00000000Stack frame #00 pc 00000716 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #01 pc 00000740 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #02 pc 00017e34 /system/lib/libdvm.soStack frame #03 pc 0004968c /system/lib/libdvm.soStack frame #04 pc 0004ee62 /system/lib/libdvm.so 32
  • Разбираемся с ошибками ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:user/release-keyspid: 7348, tid: 7348 >>> com.shturmann.yac <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),fault addr 00000000Stack frame #00 pc 00000716 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #01 pc 00000740 /data/data/com.shturmann.yac/lib/libYaC.soStack frame #02 pc 00017e34 /system/lib/libdvm.soStack frame #03 pc 0004968c /system/lib/libdvm.soStack frame #04 pc 0004ee62 /system/lib/libdvm.so 33
  • Разбираемся с ошибками • addr2line • objdump • ndk-stack 34
  • Разбираемся с ошибками$ adb logcat -d | ndk-stack -sym ~/src/obj/local/armeabi 35
  • Разбираемся с ошибкамиStack frame #00 pc 00000716/data/data/com.shturmann.yac/lib/libYaC.so:Routine get_a in /home/ybereza/src/YaC/yac/jni/YaC.cpp:13Stack frame #01 pc 00000740/data/data/com.shturmann.yac/lib/libYaC.so:Routine Java_com_shturmann_yac_YaCActivity_doSomethingin /home/ybereza/src/YaC/yac/jni/YaC.cpp:24 36
  • Разбираемся с ошибкамиStack frame #00 pc 00000716/data/data/com.shturmann.yac/lib/libYaC.so:Routine get_a in /home/ybereza/src/YaC/yac/jni/YaC.cpp:13Stack frame #01 pc 00000740/data/data/com.shturmann.yac/lib/libYaC.so:Routine Java_com_shturmann_yac_YaCActivity_doSomethingin /home/ybereza/src/YaC/yac/jni/YaC.cpp:24 37
  • Разбираемся с ошибкамиStack frame #00 pc 00000716/data/data/com.shturmann.yac/lib/libYaC.so:Routine get_a in /home/ybereza/src/YaC/yac/jni/YaC.cpp:13Stack frame #01 pc 00000740/data/data/com.shturmann.yac/lib/libYaC.so:Routine Java_com_shturmann_yac_YaCActivity_doSomethingin /home/ybereza/src/YaC/yac/jni/YaC.cpp:24 38
  • Ловим сигналы самостоятельноvoid install_sighandler(){ struct sigaction default_action; struct sigaction sa; memset(&sa, 0, sizeof(struct sigaction)); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = linux_sig_handler; sigemptyset(&sa.sa_mask); sigaction(SIGSEGV, &sa, &default_handler)} 39
  • Ловим сигналы самостоятельноvoid install_sighandler(){ struct sigaction default_action; struct sigaction sa; memset(&sa, 0, sizeof(struct sigaction)); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = linux_sig_handler; sigemptyset(&sa.sa_mask); sigaction(SIGSEGV, &sa, &default_handler)} 40
  • Ловим сигналы самостоятельноvoid linux_sig_handler(int sig, struct siginfo_t* info, void* context){ LOG_FLUSH; default_handler.sa_handler(sig);} 41
  • Ловим сигналы самостоятельноvoid linux_sig_handler(int sig, struct siginfo_t* info, void* context){ LOG_FLUSH; default_handler.sa_handler(sig);} 42
  • Ловим сигналы самостоятельно#include <asm/sigcontext.h>struct ucontext{ unsigned long uc_flags; struct ucontext *uc_link; stack_t uc_stack; sigcontext uc_mcontext;} 43
  • Ловим сигналы самостоятельно#include <asm/sigcontext.h>struct ucontext{ unsigned long uc_flags; struct ucontext *uc_link; stack_t uc_stack; sigcontext uc_mcontext;} 44
  • Ловим сигналы самостоятельно/proc/<id вашего процесса>/maps 45
  • Где взятьhttps://bitbucket.org/ybereza/yac/src 46
  • Профилирование 47
  • Профилирование Но! 48
  • ПрофилированиеDDMS Native Heap ~/.android/ddms.cfg “native=true” :$ ddms Из корня вашего проекта :$ emulator -help-memcheck :$ emulator -memcheck 1 49
  • Для чего все это нужно? 50
  • Берёза ЮрийShturmannybereza@gmail.com 51