79
©SIProp Project, 2006-2008 1 How to Make Android Native Application Noritsuna Imamura [email protected]

How to Make Android Native Application

Embed Size (px)

DESCRIPTION

How to Make NativeActivity Application NativeActivityGlue How to Draw Something How to Use Library(OpenCV) How to Debug NativeActivity Application Debug Profiling

Citation preview

Page 1: How to Make Android Native Application

©SIProp Project, 2006-2008 1

How to Make Android Native Application

Noritsuna Imamura

[email protected]

Page 2: How to Make Android Native Application

©SIProp Project, 2006-2008 2

Agenda

How to Make NativeActivity Application

NativeActivityGlue

How to Draw Something

How to Use Library(OpenCV)

How to Debug NativeActivity Application

Debug

Profiling

Page 3: How to Make Android Native Application

©SIProp Project, 2006-2008 3

How to Make Native Application

with Eclipse

Page 4: How to Make Android Native Application

©SIProp Project, 2006-2008 4

Native Application

NDK wo/ADT

Standard Android Application for C/C++

Only C/C++ on LimitedLibrary Layer

Advantage

Only C/C++

DirectCall C/C++ API

Dis-Advantage

Use a few Android Tools

A few Docs from Google Developer Site & Blogs

APK File(Your Application)(C/C++)

Library Layer (C/C++)

Kernel/Driver Layer(C/ASM)

Call as C/C++ APIs

Call as SysCall(C/ASM)

Call Stack

Page 5: How to Make Android Native Application

©SIProp Project, 2006-2008 5

Make Android Project

Page 6: How to Make Android Native Application

©SIProp Project, 2006-2008 6

Setup App Name & Target API

Page 7: How to Make Android Native Application

©SIProp Project, 2006-2008 7

Enable JNI

Page 8: How to Make Android Native Application

©SIProp Project, 2006-2008 8

Enable JNI

Page 9: How to Make Android Native Application

©SIProp Project, 2006-2008 9

SampleNativeActivity.cpp

1. #include <jni.h>

Page 10: How to Make Android Native Application

©SIProp Project, 2006-2008 10

Android.mk

1. LOCAL_PATH := $(call my-dir)

2. include $(CLEAR_VARS)

3. LOCAL_MODULE := SampleNativeActivity4. LOCAL_SRC_FILES :=

SampleNativeActivity.cpp

5. include $(BUILD_SHARED_LIBRARY)

Page 11: How to Make Android Native Application

©SIProp Project, 2006-2008 11

LifeCycle Diagram

Activity is Event Driven Arch

Main Event

onCreate()Start Activity

Initialize Objects

onStart()Finish Initialized

onPause()Other Activity Start

onResume()Back from Other Activity

onStop()Don’t back long time

Page 12: How to Make Android Native Application

©SIProp Project, 2006-2008 12

LifeCycle in NativeActivity

[ndk dir]/platforms/android-19/arch-arm/usr/include/android

native-activity.h

1. typedef struct ANativeActivityCallbacks {2. void (*onStart)(ANativeActivity* activity);3.4. void (*onResume)(ANativeActivity* activity);5.6. void* (*onSaveInstanceState)(ANativeActivity*

activity, size_t* outSize);7.8. void (*onPause)(ANativeActivity* activity);9.10. void (*onStop)(ANativeActivity* activity);11.12. void (*onDestroy)(ANativeActivity* activity);

Page 13: How to Make Android Native Application

©SIProp Project, 2006-2008 13

NativeActivity CallBacksNativeActivity Effect

onStart = Activity.onStart()

onResume = Activity.onResume()

onSaveInstanceState = Activity.onSaveInstanceState()

onPause = Activity.onPause()

onStop = Activity.onStop()

onDestroy = Activity.onDestroy()

onWindowsFocusChanged Focus of Window was Changed

onNativeWindowCreated Native Windows was Created

onNativeWindowResized Native Window was Re-sized

onNativeWindowRedrawNeeded Native Window was Required Re-Draw

onNativeWindowDestroyed Native Window was Destroyed

onInputQueueCreated InputQueue was Created

onInputQueueDestroyed InputQueue was Destroyed

onContentRectChanged Drawable Area was Changed (Ex.Keyboard)

onConfiguratinChanged System Configuration was Changed

onLowMemory System Memory was Low

Page 14: How to Make Android Native Application

©SIProp Project, 2006-2008 14

Problem Point

You MUST write it as Non-Block Function.

In other word, you MUST use “Thread”.Thread Programing is sooooo hard…

Why? Go to Next Page!

Page 15: How to Make Android Native Application

©SIProp Project, 2006-2008 15

NativeActivityGlue CallBacksNativeActivity NativeActivityGlue

onStart APP_CMD_START

onResume APP_CMD_RESUME

onSaveInstanceState APP_CMD_SAVE_STATE

onPause APP_CMD_PAUSE

onStop APP_CMD_STOP

onDestroy APP_CMD_DESTROY

onWindowsFocusChanged APP_CMD_GAINED_FOCUSAPP_CMD_LOST_FOCUS

onNativeWindowCreated APP_CMD_INIT_WINDOW

onNativeWindowResized APP_CMD_WINDOW_RESIZED

onNativeWindowRedrawNeeded APP_CMD_WINDOW_REDRAW_NEEDED

onNativeWindowDestroyed APP_CMD_TERM_WINDOW

onInputQueueCreatedonInputQueueDestroyed

APP_CMD_INPUT_CHANGED

onContentRectChanged APP_CMD_CONTENT_RECT_CHANGED

onConfiguratinChanged APP_CMD_CONFIG_CHANGED

onLowMemory APP_CMD_LOW_MEMORY

Page 16: How to Make Android Native Application

©SIProp Project, 2006-2008 16

NativeActivityGlue

[NDK dir]/sources/android/native_app_glue1. void android_app_pre_exec_cmd(struct android_app* android_app,

int8_t cmd) {2. switch (cmd) {3. case APP_CMD_INPUT_CHANGED:4. LOGV("APP_CMD_INPUT_CHANGED\n");5. pthread_mutex_lock(&android_app->mutex);6. if (android_app->inputQueue != NULL) {7. AInputQueue_detachLooper(android_app->inputQueue);8. }9. android_app->inputQueue = android_app-

>pendingInputQueue;10. if (android_app->inputQueue != NULL) {11. LOGV("Attaching input queue to looper");12. AInputQueue_attachLooper(android_app->inputQueue,13. android_app->looper, LOOPER_ID_INPUT, NULL,14. &android_app->inputPollSource);15. }16. pthread_cond_broadcast(&android_app->cond);17. pthread_mutex_unlock(&android_app->mutex);18. break;

Page 17: How to Make Android Native Application

©SIProp Project, 2006-2008 17

Sample of NativeActivityGlue

Don’t Need to Use “thread” Funcs.

1. static void engine_handle_cmd(android_app* app, int32_t cmd) {2. Engine* engine = (Engine*)app->userData;3. switch (cmd) {4. case APP_CMD_INIT_WINDOW:5. if (app->window != NULL)6. LOGI("APP_CMD_INIT_WINDOW");7. break;8. case APP_CMD_TERM_WINDOW:9. LOGI("APP_CMD_TERM_WINDOW");10. break;

Page 18: How to Make Android Native Application

©SIProp Project, 2006-2008 18

Functions that you CAN USE

Build-in Libs: How to Use: -lxx

[NDK DIR]/platforms/android-19/arch-arm/usr/liblibandroid.so

NativeActivity Lib

libc.so

libstdc++.so

libc

libdl.so

Dynamic Load Lib

libEGL.so

libGLESv1_CM.so

libGLESv2.so

libGLESv3.so

libjnigraphics.so

Graphic Funcs

liblog.so

Logging

libm.so

Math Lib

libOpenMAXAL.so

Media Lib

libOpenSLES.so

Sound Lib

libthread_db.so

thread

libz.so

Zip Lib

Page 19: How to Make Android Native Application

©SIProp Project, 2006-2008 19

Edit jni/Android.mk 8/8

Add Loading Lib & OpenCV Lib

LOCAL_LDLIBS-lc -ldl -lz

LOCAL_STATIC_LIBRARIES$(foreach mod, $(OPENCV_MODULES), opencv_$(mod)) $(OPENCV_3RDPARTY_COMPONENTS)

1. LOCAL_LDLIBS += -lm -llog -landroid -lc -ldl -lz

2. LOCAL_STATIC_LIBRARIES := android_native_app_glue $(foreach mod, $(OPENCV_MODULES), opencv_$(mod)) $(OPENCV_3RDPARTY_COMPONENTS)

Page 20: How to Make Android Native Application

©SIProp Project, 2006-2008 20

Edit jni/Android.mk 4/8

Make Loading OpenCV Libs Function

1. $(foreachmodule,$(OPENCV_3RDPARTY_COMPONENTS),$(eval $(call add_opencv_3rdparty_component,$(module))))

1. define add_opencv_3rdparty_component2. include $(CLEAR_VARS)3. LOCAL_MODULE:=$14. LOCAL_SRC_FILES:=../../opencv-

2.4.7/platforms/build_android_service/3rdparty/lib/armeabi-v7a/lib$1.a

5. include $(PREBUILT_STATIC_LIBRARY)6. endef

Page 21: How to Make Android Native Application

©SIProp Project, 2006-2008 21

Edit jni/Android.mk 6/8

Make Loading AndroidCamera Libs Function

1. $(foreachmodule,$(OPENCV_CAMERA_MODULES),$(eval $(call add_opencv_camera_module,$(module))))

1. define add_opencv_camera_module2. include $(CLEAR_VARS)3. LOCAL_MODULE:=$14. LOCAL_SRC_FILES:=../../opencv-

2.4.7/platforms/build_android_service/lib/armeabi-v7a/lib$1.so

5. include $(PREBUILT_SHARED_LIBRARY)6. endef

Page 22: How to Make Android Native Application

©SIProp Project, 2006-2008 22

How to Use NativeActivityGlue

Page 23: How to Make Android Native Application

©SIProp Project, 2006-2008 23

Edit AndroidManifest.xml

Replace “application” Section

1. <application android:label="@string/app_name" android:hasCode="false">

2. <activity android:name="android.app.NativeActivity"3. android:label="@string/app_name"4.

android:configChanges="orientation|keyboardHidden">5. <!-- Tell NativeActivity the name of or .so -->6. <meta-data android:name="android.app.lib_name"7. android:value=”SampleNativeActivity" />8. <intent-filter>9. <action

android:name="android.intent.action.MAIN" />10. <category

android:name="android.intent.category.LAUNCHER" />11. </intent-filter>12. </activity>13. </application>

Page 24: How to Make Android Native Application

©SIProp Project, 2006-2008 24

CPP Code of Basicary Format

1. #include <android_native_app_glue.h>

2. void android_main() {3.4. // Init Parameters5.6. // Loop7. while(1) {8.9. //Do your Program Code10.11. //Drawing to Android Display12.13. if(finish == TRUE) {14. // Processing closing15. return;16. }17. }18. }

Page 25: How to Make Android Native Application

©SIProp Project, 2006-2008 25

Show Android Event

jni/SampleNativeActivity.cpp

#include <android_native_app_glue.h>#include <android/log.h>

#define LOG_TAG "MyApp:SampleNativeActivity"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

Page 26: How to Make Android Native Application

©SIProp Project, 2006-2008 26

Show Android Event

jni/SampleNativeActivity.cppstruct Engine {struct android_app* app;};

void android_main(android_app* app) {

// Init Parametersstruct Engine engine;

// It's magic func for NativeActivityGlue.app_dummy();

// Set UserDatamemset(&engine, 0, sizeof(engine));app->userData = &engine;

app->onAppCmd = engine_handle_cmd;engine.app = app;

Page 27: How to Make Android Native Application

©SIProp Project, 2006-2008 27

Show Android Event

jni/SampleNativeActivity.cpp// Loopwhile(1) {

// Read all pending events.int ident;int events;android_poll_source* source;

// Process system eventswhile ((ident=ALooper_pollAll(0, NULL, &events, (void**)&source)) >=

0) {// Process this event.if (source != NULL) {

source->process(app, source);}//Do your Program Code

//Drawing to Android Display}

}}

Page 28: How to Make Android Native Application

©SIProp Project, 2006-2008 28

Show Android Event

jni/SampleNativeActivity.cppstatic void engine_handle_cmd(android_app* app, int32_t cmd) {

Engine* engine = (Engine*)app->userData;switch (cmd) {

case APP_CMD_START:LOGI("APP_CMD_START");break;case APP_CMD_RESUME:LOGI("APP_CMD_RESUME");break;case APP_CMD_SAVE_STATE:LOGI("APP_CMD_SAVE_STATE");break;case APP_CMD_PAUSE:LOGI("APP_CMD_PAUSE");break;case APP_CMD_STOP:LOGI("APP_CMD_STOP");break;case APP_CMD_DESTROY:LOGI("APP_CMD_DESTROY");break;

Page 29: How to Make Android Native Application

©SIProp Project, 2006-2008 29

Show Android Event

Add the Red Lines to Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := SampleNativeActivityLOCAL_SRC_FILES := SampleNativeActivity.cppLOCAL_LDLIBS += -llog -landroidLOCAL_STATIC_LIBRARIES := android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

Page 30: How to Make Android Native Application

©SIProp Project, 2006-2008 30

Page 31: How to Make Android Native Application

©SIProp Project, 2006-2008 31

How to Draw Text

Page 32: How to Make Android Native Application

©SIProp Project, 2006-2008 32

How to Draw Text?

NDK doesn’t have this function!!!

You CAN USE Bitmap File Only!!!

Use Open GL/ES

Use OpenCV .

Page 33: How to Make Android Native Application

©SIProp Project, 2006-2008 33

How to Draw Text with OpenCV

Page 34: How to Make Android Native Application

©SIProp Project, 2006-2008 34

Setup OpenCV Libs

Libs

libs_opencv

include Files

jni/include

Page 35: How to Make Android Native Application

©SIProp Project, 2006-2008 35

Edit jni/Android.mk 1/5

After “LOCAL_PATH := $(call my-dir)” Line

1. include $(CLEAR_VARS)

2. OPENCV_MODULES:=contrib legacy ml stitching objdetectts videostab video photo calib3d features2d highgui imgprocflann core

3. OPENCV_3RDPARTY_COMPONENTS:=tbb libjpeg libpng libtiff libjasper IlmImf

Page 36: How to Make Android Native Application

©SIProp Project, 2006-2008 36

Edit jni/Android.mk 2/5

1. define add_opencv_module2. include $(CLEAR_VARS)3. LOCAL_MODULE:=opencv_$14. LOCAL_SRC_FILES:=../libs_opencv/libopencv_$1.a5. include $(PREBUILT_STATIC_LIBRARY)6. endef

7. define add_opencv_3rdparty_component8. include $(CLEAR_VARS)9. LOCAL_MODULE:=$110. LOCAL_SRC_FILES:=../libs_opencv/lib$1.a11. include $(PREBUILT_STATIC_LIBRARY)12. endef

Page 37: How to Make Android Native Application

©SIProp Project, 2006-2008 37

Edit jni/Android.mk 3/5

1. include $(CLEAR_VARS)2. LOCAL_MODULE:=opencv_info3. LOCAL_SRC_FILES:=../libs_opencv/libopencv_info.so4. include $(PREBUILT_SHARED_LIBRARY)

5. $(foreach module,$(OPENCV_MODULES),$(eval $(call add_opencv_module,$(module))))

6. $(foreach module,$(OPENCV_3RDPARTY_COMPONENTS),$(eval $(call add_opencv_3rdparty_component,$(module))))

Page 38: How to Make Android Native Application

©SIProp Project, 2006-2008 38

Edit jni/Android.mk 4/5

1. OPENCV_INCLUDE_DIR:=$(LOCAL_DIR)/include2. LOCAL_C_INCLUDES+=$(OPENCV_INCLUDE_DIR)

Page 39: How to Make Android Native Application

©SIProp Project, 2006-2008 39

Edit jni/Android.mk 5/5

Add Loading Lib & OpenCV Lib

LOCAL_LDLIBS-lm -lc -ldl -lz

LOCAL_STATIC_LIBRARIES$(foreach mod, $(OPENCV_MODULES), opencv_$(mod)) $(OPENCV_3RDPARTY_COMPONENTS)

1. LOCAL_LDLIBS += -llog -landroid –lm -lc -ldl -lz

2. LOCAL_STATIC_LIBRARIES := android_native_app_glue $(foreach mod, $(OPENCV_MODULES), opencv_$(mod)) $(OPENCV_3RDPARTY_COMPONENTS)

Page 40: How to Make Android Native Application

©SIProp Project, 2006-2008 40

Application.mk

Create “Application.mk”

1. APP_STL := gnustl_static2. APP_CPPFLAGS := -frtti -fexceptions3. APP_ABI := armeabi-v7a4. APP_PLATFORM := android-15

Page 41: How to Make Android Native Application

©SIProp Project, 2006-2008 41

SampleNativeActivity.cpp

Init Buffer

case APP_CMD_INIT_WINDOW:LOGI("APP_CMD_INIT_WINDOW");

{int view_width = ANativeWindow_getWidth(app->window);int view_height = ANativeWindow_getHeight(app->window);// Init Framebufferif (ANativeWindow_setBuffersGeometry(app->window,

view_width,view_height, WINDOW_FORMAT_RGBA_8888) < 0) {LOGE("Cannot set pixel format!");return;

}LOGI("cv::Mat initialized at resolution %dx%d", view_width,

view_height);}

break;

Page 42: How to Make Android Native Application

©SIProp Project, 2006-2008 42

SampleNativeActivity.cpp

New Engine

1. struct Engine {2. struct android_app* app;

3. int init_window;4. };

Page 43: How to Make Android Native Application

©SIProp Project, 2006-2008 43

SampleNativeActivity.cpp1. static void engine_draw_frame(struct Engine* engine, const cv::Mat& frame) {

2. if (engine->app->window == NULL) {3. // No window.4. return;5. }

6. ANativeWindow_Buffer buffer;7. if (ANativeWindow_lock(engine->app->window, &buffer, NULL) < 0) {8. LOGW("Unable to lock window buffer");9. return;10. }

11. {12. uint16_t* pixels = (uint16_t*)buffer.bits;

13. for( int y = 0; y < frame.size().height; y ++ ) {14. for( int x = 0; x < frame.size().width; x ++ ) {15. cv::Vec3b bgr = frame.at< cv::Vec3b >( y, x );16. pixels[x] = make565( bgr[2], bgr[1], bgr[0] );17. }18. pixels = (uint16_t*)pixels + buffer.stride;19. }20. }21. ANativeWindow_unlockAndPost(engine->app->window);22. }

Page 44: How to Make Android Native Application

©SIProp Project, 2006-2008 44

SampleNativeActivity.cpp

1. // Loop2. while(1) {3. // Read all pending events.4. int ident;5. int events;6. android_poll_source* source;

7. // Process system events8. while ((ident=ALooper_pollAll(0, NULL, &events,

(void**)&source)) >= 0) {9. // Process this event.10. if (source != NULL) {11. source->process(app, source);12. }13. }14. }

Page 45: How to Make Android Native Application

©SIProp Project, 2006-2008 45

SampleNativeActivity.cpp

1. //Do your Program Code2. if (engine.init_window) {3. // Init Mat4. int view_width = ANativeWindow_getWidth(app->window);5. int view_height = ANativeWindow_getHeight(app->window);6. cv::Mat img =7. cv::Mat::zeros(view_width, view_height, CV_8UC3);8. char buffer[256];9. sprintf(buffer, "Show Display Size: %dx%d", img.cols,

img.rows);10. cv::putText(img, std::string(buffer), cv::Point(256,128),11. cv::FONT_HERSHEY_COMPLEX_SMALL, 1,

cv::Scalar(255,255,255));

12. //Drawing to Android Display13. engine_draw_frame(&engine, img);14. }15. }

Page 46: How to Make Android Native Application

©SIProp Project, 2006-2008 46

How to Camera with OpenCV

Page 47: How to Make Android Native Application

©SIProp Project, 2006-2008 47

AndroidManifest.xml

Add “Camera” Permissions

1. <uses-permission android:name="android.permission.CAMERA"/>

2. <uses-feature android:name="android.hardware.camera" android:required="false"/>

3. <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>

4. <uses-feature android:name="android.hardware.camera.front" android:required="false"/>

5. <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>

Page 48: How to Make Android Native Application

©SIProp Project, 2006-2008 48

Edit jni/Android.mk 1/5

After “LOCAL_PATH := $(call my-dir)” Line

1. OPENCV_CAMERA_MODULES:= native_camera_r2.2.0 native_camera_r2.3.3 native_camera_r3.0.1 native_camera_r4.0.0 native_camera_r4.0.3 native_camera_r4.1.1 native_camera_r4.2.0 native_camera_r4.3.0

1. define add_opencv_camera_module2. include $(CLEAR_VARS)3. LOCAL_MODULE:=$14. LOCAL_SRC_FILES:=../libs_opencv/lib$1.so5. include $(PREBUILT_SHARED_LIBRARY)6. endef

Page 49: How to Make Android Native Application

©SIProp Project, 2006-2008 49

Edit jni/Android.mk 3/5

1. LOCAL_SRC_FILES:=../libs_opencv/libopencv_info.so2. include $(PREBUILT_SHARED_LIBRARY)

3. $(foreach module,$(OPENCV_MODULES),$(eval $(call add_opencv_module,$(module))))

4. $(foreach module,$(OPENCV_3RDPARTY_COMPONENTS),$(eval $(call add_opencv_3rdparty_component,$(module))))

5. $(foreach module,$(OPENCV_CAMERA_MODULES),$(eval $(call add_opencv_camera_module,$(module))))

Page 50: How to Make Android Native Application

©SIProp Project, 2006-2008 50

SampleNativeActivity.cpp

Init Camera

case APP_CMD_INIT_WINDOW:LOGI("APP_CMD_INIT_WINDOW");

if (app->window != NULL){

LOGI("APP_CMD_INIT_WINDOW");

engine->capture = new cv::VideoCapture(0);

union {double prop; const char* name;} u;u.prop = engine->capture-

>get(CV_CAP_PROP_SUPPORTED_PREVIEW_SIZES_STRING);

int view_width = ANativeWindow_getWidth(app->window);int view_height = ANativeWindow_getHeight(app->window);

cv::Size camera_resolution;if (u.name)

camera_resolution = calc_optimal_camera_resolution(u.name, 640, 480);

else{

LOGE("Cannot get supported camera camera_resolutions");camera_resolution = cv::Size(ANativeWindow_getWidth(app-

>window),ANativeWindow_getHeight(app->window));

}

Page 51: How to Make Android Native Application

©SIProp Project, 2006-2008 51

SampleNativeActivity.cpp

Init Camera

if ((camera_resolution.width != 0) && (camera_resolution.height != 0))

{engine->capture->set(CV_CAP_PROP_FRAME_WIDTH,

camera_resolution.width);engine->capture->set(CV_CAP_PROP_FRAME_HEIGHT,

camera_resolution.height);}

float scale = std::min((float)view_width/camera_resolution.width,(float)view_height/camera_resolution.height);

if (ANativeWindow_setBuffersGeometry(app->window, (int)(view_width/scale),

int(view_height/scale), WINDOW_FORMAT_RGBA_8888) < 0){

LOGE("Cannot set pixel format!");return;

}

LOGI("Camera initialized at resolution %dx%d", camera_resolution.width, camera_resolution.height);

}break;

Page 52: How to Make Android Native Application

©SIProp Project, 2006-2008 52

SampleNativeActivity.cpp

New Engine

1. struct Engine {2. struct android_app* app;3. cv::Ptr<cv::VideoCapture> capture;4. };

Page 53: How to Make Android Native Application

©SIProp Project, 2006-2008 53

SampleNativeActivity.cpp1. cv::Mat drawing_frame;

2. // Loop3. while(1) {4. // Read all pending events.5. int ident;6. int events;7. android_poll_source* source;

8. // Process system events9. while ((ident=ALooper_pollAll(0, NULL, &events, (void**)&source)) >= 0) {10. // Process this event.11. if (source != NULL) {12. source->process(app, source);13. }14. }15. //Do your Program Code16. // Capture frame from camera and draw it17. if (!engine.capture.empty()) {18. if (engine.capture->grab())19. engine.capture->retrieve(drawing_frame,

CV_CAP_ANDROID_COLOR_FRAME_RGBA);20. engine_draw_frame(&engine, drawing_frame);21. }22. }

Page 54: How to Make Android Native Application

©SIProp Project, 2006-2008 54

How to Use Debugger

Page 55: How to Make Android Native Application

©SIProp Project, 2006-2008 55

Setup Debug Option

Page 56: How to Make Android Native Application

©SIProp Project, 2006-2008 56

Build as Debug Mode

Page 57: How to Make Android Native Application

©SIProp Project, 2006-2008 57

Enjoy Debugging!

Page 58: How to Make Android Native Application

©SIProp Project, 2006-2008 58

How to Use Profiler

Page 59: How to Make Android Native Application

©SIProp Project, 2006-2008 59

Android SDK Tools 8/12

lint

Optimize Android Applications.lint | Android Developers

http://developer.android.com/tools/help/lint.html

Page 60: How to Make Android Native Application

©SIProp Project, 2006-2008 60

Run lint

Page 61: How to Make Android Native Application

©SIProp Project, 2006-2008 61

Android SDK Tools 6/12

hprof-conv

Convert Android Original Format Heap Memory Dump to Standard Format. Ex. Eclipse Memory Analyzer (MAT)

HPROF Converter | Android Developers

http://developer.android.com/tools/help/hprof-conv.html

Page 62: How to Make Android Native Application

©SIProp Project, 2006-2008 62

Setup Eclipse Memory Analyzer (MAT)

Page 63: How to Make Android Native Application

©SIProp Project, 2006-2008 63

Setup Eclipse Memory Analyzer (MAT)

Page 64: How to Make Android Native Application

©SIProp Project, 2006-2008 64

Show HeapMemory

Page 65: How to Make Android Native Application

©SIProp Project, 2006-2008 65

Add Memory Leak Code

1. char *str = (char *)malloc(10000);2. if(engine.counter < 65535) {3. engine.leak[engine.counter] = (int)str;4. LOGW("Leak Memory!!! %d", (int)str);5. } else {6. engine.counter = 0;7. }

Page 66: How to Make Android Native Application

©SIProp Project, 2006-2008 66

But,,,Java Heap Only

Page 67: How to Make Android Native Application

©SIProp Project, 2006-2008 67

Android SDK Tools 11/12

Systrace

Profiling Tool. Use with Android Device Monitor.Analyzing Display and Performance with Systrace | Android Developers

http://developer.android.com/tools/debugging/systrace.html

traceview

Show Graphical View from Systrace DataTraceview | Android Developers

http://developer.android.com/tools/help/traceview.html

deprecated

Android Device Monitor

Page 68: How to Make Android Native Application

©SIProp Project, 2006-2008 68

Systrace & TraceView

Page 69: How to Make Android Native Application

©SIProp Project, 2006-2008 69

View from Traceview

Page 70: How to Make Android Native Application

©SIProp Project, 2006-2008 70

Android SDK Tools 4/12

dmtracedump

Create Graphical Diagram from SysTrace Datadmtracedump | Android Developers

http://developer.android.com/tools/help/dmtracedump.html

Page 71: How to Make Android Native Application

©SIProp Project, 2006-2008 71

Setup More Tools

Python

http://www.python.org/

Graphviz

http://www.graphviz.orgsudo apt-get install graphviz

Page 72: How to Make Android Native Application

©SIProp Project, 2006-2008 72

How to Use

sdk/tools

dmtracedump-g [Graph Image Name] [Trace Data]

Page 73: How to Make Android Native Application

©SIProp Project, 2006-2008 73

sdk/platform-tools/systrace/systrace.pyOptions

--time=[s]

4.2 and lower

--cpu-freq

--cpu-idle

--cpu-load

--no-cpu-sched

--set-tags=<TAGS>

gfx - Graphics

input - Input

view - View

webview - WebView

wm - Window Manager

am - Activity Manager

sync – Synchronization

audio - Audio

video - Video

camera - Camera

4.3 and Upper

--list-categories

gfx - Graphics

input - Input

view - View

webview - WebView

wm - Window Manager

am - Activity Manager

audio - Audio

video - Video

camera - Camera

hal - Hardware Modules

res - Resource Loading

dalvik - Dalvik VM

rs - RenderScript

sched - CPU Scheduling

freq - CPU Frequency

membus - Memory Bus

Utilization

idle - CPU Idle

disk - Disk input and

output

load - CPU Load

sync - Synchronization

Manager

workq - Kernel

Workqueues

Page 74: How to Make Android Native Application

©SIProp Project, 2006-2008 74

How to User on 4.2

./systrace.py

--cpu-freq --cpu-idle --cpu-load --no-cpu-sched --set-tags=gfx,input,view,webview,wm,am,sync,audio,video,camera

adb shell stop

adb shell start

./systrace.py --time=10 -o mynewtrace.html

Page 75: How to Make Android Native Application

©SIProp Project, 2006-2008 75

If it doesn’t work…

Check these Configuration

kernel configKernel hacking ---> Tracers ---> Scheduling Latency Tracer

init.trace.rcmount debugfs /sys/kernel/debug /sys/kernel/debug

Page 76: How to Make Android Native Application

©SIProp Project, 2006-2008 76

Appendix

Page 77: How to Make Android Native Application

©SIProp Project, 2006-2008 77

ARM DS-5 Development Studio

Functions

Debugger for Linux/Android™/RTOS-aware

The ARM Streamline system-wide performance analyzer

Real-Time system model Simulators

All conveniently Packaged in Eclipse.http://www.arm.com/products/tools/software-tools/ds-5/index.php

Page 78: How to Make Android Native Application

©SIProp Project, 2006-2008 78

IDE

Page 79: How to Make Android Native Application

©SIProp Project, 2006-2008 79

Analyzer