Разработка приложений для Android на C++Берёза ЮрийпрограммистShturmannYaC, Москва, 19 сентября 2011 года                 ...
С чего начать• Linux• Java• Eclipse• C++• GCC• GDB• Android SDK                                2
3
4
Что такое NDK?    http://developer.android.com/sdk/ndk/index.html• Заголовочные файлы и библиотеки• GCC компилятор• Систем...
Создание проекта• Запустить Eclipse• Указать в настройках  путь к SDK• Запустить мастер  создания Android  приложения     ...
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       :=   gnu...
Android.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE      :=   YaCLOCAL_CFLAGS      :=   -I$(LOCAL_PATH...
Поддержка расширенных инструкций              NEONhttp://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html              ...
Или#include <cpu-features.h>void do_something(){  if ((android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&      (android_g...
JNI. Javapackage com.shturmann.yac;public class YaCActivity {    private native void doSomething();    static {        Sys...
JNI. Javapackage com.shturmann.yac;public class YaCActivity {    private native void doSomething();    static {        Sys...
JNI. Javapackage com.shturmann.yac;public class YaCActivity {    private native void doSomething();    static {        Sys...
JNI. Javapackage com.shturmann.yac;public class YaCActivity {    private native void doSomething();    static {        Sys...
JNIJava   +   /usr/bin/javah   =   C                                    17
JNI.C++JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv * env, jobject obj){    ...}           ...
JNI.C++JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv * env, jobject obj){    ...}           ...
JNIEnvJavaVM * gJVM = 0;JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){  gJVM = ...
Локальные/глобальные ссылкиjclass * gYac = 0;JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv *...
JNIEnv::FindClassjclass gYac = 0;JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){...
JNIEnv::ExceptionCheckJNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){    ...    ...
JNIEnv::PushLocalFrame/PopLocalFrameJNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject ob...
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• ...
Запускаем сборку приложения• ndk-build• ant install                                    27
28
Отладка            Android 2.3 Gingerbred• ndk-gdb                         • Eclipse      http://mitya.pp.ru/gdb/gdb_toc.h...
Разбираемся с ошибками        ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:us...
Разбираемся с ошибками        ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:us...
Разбираемся с ошибками        ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:us...
Разбираемся с ошибками        ********** Crash dump: **********Build fingerprint: google/soju/crespo:2.3.4/GRJ22/121341:us...
Разбираемся с ошибками     • addr2line     • objdump     • ndk-stack                         34
Разбираемся с ошибками$ adb logcat -d | ndk-stack -sym ~/src/obj/local/armeabi                                            ...
Разбираемся с ошибкамиStack frame #00 pc 00000716/data/data/com.shturmann.yac/lib/libYaC.so:Routine get_a in /home/ybereza...
Разбираемся с ошибкамиStack frame #00 pc 00000716/data/data/com.shturmann.yac/lib/libYaC.so:Routine get_a in /home/ybereza...
Разбираемся с ошибкамиStack frame #00 pc 00000716/data/data/com.shturmann.yac/lib/libYaC.so:Routine get_a in /home/ybereza...
Ловим сигналы самостоятельноvoid install_sighandler(){    struct sigaction default_action;    struct sigaction sa;    mems...
Ловим сигналы самостоятельноvoid install_sighandler(){    struct sigaction default_action;    struct sigaction sa;    mems...
Ловим сигналы самостоятельноvoid linux_sig_handler(int sig, struct siginfo_t* info, void* context){    LOG_FLUSH;    defau...
Ловим сигналы самостоятельноvoid linux_sig_handler(int sig, struct siginfo_t* info, void* context){    LOG_FLUSH;    defau...
Ловим сигналы самостоятельно#include <asm/sigcontext.h>struct ucontext{    unsigned long uc_flags;    struct ucontext *uc_...
Ловим сигналы самостоятельно#include <asm/sigcontext.h>struct ucontext{    unsigned long uc_flags;    struct ucontext *uc_...
Ловим сигналы самостоятельно/proc/<id вашего процесса>/maps                                  45
Где взятьhttps://bitbucket.org/ybereza/yac/src                                        46
Профилирование                 47
Профилирование     Но!         48
ПрофилированиеDDMS Native Heap  ~/.android/ddms.cfg    “native=true” :$ ddms      Из корня вашего проекта :$ emulator -hel...
Для чего все это нужно?                          50
Берёза ЮрийShturmannybereza@gmail.com                    51
Upcoming SlideShare
Loading in...5
×

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

9,591

Published on

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

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

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

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

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
9,591
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Разработка приложений для Android на C++Берёза ЮрийпрограммистShturmannYaC, Москва, 19 сентября 2011 года 1
  2. 2. С чего начать• Linux• Java• Eclipse• C++• GCC• GDB• Android SDK 2
  3. 3. 3
  4. 4. 4
  5. 5. Что такое NDK? http://developer.android.com/sdk/ndk/index.html• Заголовочные файлы и библиотеки• GCC компилятор• Система сборки приложений• Набор дополнительных утилит 5
  6. 6. Создание проекта• Запустить Eclipse• Указать в настройках путь к SDK• Запустить мастер создания Android приложения 6
  7. 7. Sequoyah Android Native Code Support http://www.eclipse.org/sequoyah/ 7
  8. 8. Добавляем поддержку NDK 8
  9. 9. Application.mkAPP_MODULES := YaCAPP_CFLAGS := -DDEBUG -D__ANDROID__APP_OPTIM := debugAPP_STL := gnustl_staticAPP_ABI := armeabi armeabi-v7a 9
  10. 10. 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
  11. 11. Поддержка расширенных инструкций 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
  12. 12. Или#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
  13. 13. JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 13
  14. 14. JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 14
  15. 15. JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 15
  16. 16. JNI. Javapackage com.shturmann.yac;public class YaCActivity { private native void doSomething(); static { System.loadLibrary("YaC"); }} 16
  17. 17. JNIJava + /usr/bin/javah = C 17
  18. 18. JNI.C++JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv * env, jobject obj){ ...} 18
  19. 19. JNI.C++JNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_doSomething(JNIEnv * env, jobject obj){ ...} 19
  20. 20. 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
  21. 21. Локальные/глобальные ссылки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
  22. 22. 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
  23. 23. JNIEnv::ExceptionCheckJNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){ ... if ( !(*env)->ExceptionCheck(env) ) { ... }} 23
  24. 24. JNIEnv::PushLocalFrame/PopLocalFrameJNIEXPORT void JNICALLJava_com_shturmann_yac_YaCActivity_init(JNIEnv * env, jobject obj){ (*env)->PushLocalFrame(env, 100500); ... (*env)->PopLocalFrame(env, NULL);} 24
  25. 25. JNIhttp://java.sun.com/docs/books/jni/download/jni.pdf 25
  26. 26. Дополнительные библиотеки• 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
  27. 27. Запускаем сборку приложения• ndk-build• ant install 27
  28. 28. 28
  29. 29. Отладка Android 2.3 Gingerbred• ndk-gdb • Eclipse http://mitya.pp.ru/gdb/gdb_toc.html 29
  30. 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 30
  31. 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 31
  32. 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 32
  33. 33. Разбираемся с ошибками ********** 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
  34. 34. Разбираемся с ошибками • addr2line • objdump • ndk-stack 34
  35. 35. Разбираемся с ошибками$ adb logcat -d | ndk-stack -sym ~/src/obj/local/armeabi 35
  36. 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 36
  37. 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 37
  38. 38. Разбираемся с ошибками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
  39. 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)} 39
  40. 40. Ловим сигналы самостоятельно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
  41. 41. Ловим сигналы самостоятельноvoid linux_sig_handler(int sig, struct siginfo_t* info, void* context){ LOG_FLUSH; default_handler.sa_handler(sig);} 41
  42. 42. Ловим сигналы самостоятельноvoid linux_sig_handler(int sig, struct siginfo_t* info, void* context){ LOG_FLUSH; default_handler.sa_handler(sig);} 42
  43. 43. Ловим сигналы самостоятельно#include <asm/sigcontext.h>struct ucontext{ unsigned long uc_flags; struct ucontext *uc_link; stack_t uc_stack; sigcontext uc_mcontext;} 43
  44. 44. Ловим сигналы самостоятельно#include <asm/sigcontext.h>struct ucontext{ unsigned long uc_flags; struct ucontext *uc_link; stack_t uc_stack; sigcontext uc_mcontext;} 44
  45. 45. Ловим сигналы самостоятельно/proc/<id вашего процесса>/maps 45
  46. 46. Где взятьhttps://bitbucket.org/ybereza/yac/src 46
  47. 47. Профилирование 47
  48. 48. Профилирование Но! 48
  49. 49. ПрофилированиеDDMS Native Heap ~/.android/ddms.cfg “native=true” :$ ddms Из корня вашего проекта :$ emulator -help-memcheck :$ emulator -memcheck 1 49
  50. 50. Для чего все это нужно? 50
  51. 51. Берёза ЮрийShturmannybereza@gmail.com 51
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×