2 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2008 Navit Team
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
35 struct graphics_priv {
36 jclass NavitGraphicsClass;
37 jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera;
40 jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB;
42 jobject NavitGraphics;
45 jclass BitmapFactoryClass;
46 jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource;
49 jmethodID Bitmap_getHeight, Bitmap_getWidth;
52 jmethodID Context_getResources;
54 jclass ResourcesClass;
56 jmethodID Resources_getIdentifier;
58 struct callback_list *cbl;
62 struct graphics_font_priv {
66 struct graphics_gc_priv {
67 struct graphics_priv *gra;
69 enum draw_mode_num mode;
73 struct graphics_image_priv {
78 find_class_global(char *name, jclass *ret)
80 *ret=(*jnienv)->FindClass(jnienv, name);
82 dbg(0,"Failed to get Class %s\n",name);
85 (*jnienv)->NewGlobalRef(jnienv, *ret);
90 find_method(jclass class, char *name, char *args, jmethodID *ret)
92 *ret = (*jnienv)->GetMethodID(jnienv, class, name, args);
94 dbg(0,"Failed to get Method %s with signature %s\n",name,args);
101 find_static_method(jclass class, char *name, char *args, jmethodID *ret)
103 *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args);
105 dbg(0,"Failed to get static Method %s with signature %s\n",name,args);
112 graphics_destroy(struct graphics_priv *gr)
116 static void font_destroy(struct graphics_font_priv *font)
121 static struct graphics_font_methods font_methods = {
125 static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags)
127 struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1);
135 gc_destroy(struct graphics_gc_priv *gc)
141 gc_set_linewidth(struct graphics_gc_priv *gc, int w)
147 gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n)
152 gc_set_foreground(struct graphics_gc_priv *gc, struct color *c)
161 gc_set_background(struct graphics_gc_priv *gc, struct color *c)
165 static struct graphics_gc_methods gc_methods = {
173 static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth)
175 struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1);
179 ret->a = ret->r = ret->g = ret->b = 255;
184 static void image_destroy(struct graphics_image_priv *img)
189 static struct graphics_image_methods image_methods = {
194 static struct graphics_image_priv *
195 image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation)
197 struct graphics_image_priv *ret=g_new0(struct graphics_image_priv, 1);
201 dbg(1,"enter %s\n",path);
203 if (!strncmp(path,"res/drawable/",13)) {
204 jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable");
205 jstring b=(*jnienv)->NewStringUTF(jnienv, "org.navitproject.navit");
206 char *path_noext=g_strdup(path+13);
207 char *pos=strrchr(path_noext, '.');
210 dbg(1,"path_noext=%s\n",path_noext);
211 string = (*jnienv)->NewStringUTF(jnienv, path_noext);
213 id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, b);
216 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id);
217 (*jnienv)->DeleteLocalRef(jnienv, b);
218 (*jnienv)->DeleteLocalRef(jnienv, a);
220 string = (*jnienv)->NewStringUTF(jnienv, path);
221 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string);
223 dbg(1,"result=%p\n",ret->Bitmap);
225 (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap);
226 (*jnienv)->DeleteLocalRef(jnienv, ret->Bitmap);
227 *w=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth);
228 *h=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight);
229 dbg(1,"w=%d h=%d for %s\n",*w,*h,path);
235 dbg(0,"Failed to open %s\n",path);
237 (*jnienv)->DeleteLocalRef(jnienv, string);
242 static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc)
244 float wf = gc->linewidth;
245 (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setStrokeWidth, wf);
246 (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b);
250 draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
257 points = (*jnienv)->NewIntArray(jnienv,count*2);
258 for (i = 0 ; i < count ; i++) {
263 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc);
264 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points);
265 (*jnienv)->DeleteLocalRef(jnienv, points);
269 draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
276 points = (*jnienv)->NewIntArray(jnienv,count*2);
277 for (i = 0 ; i < count ; i++) {
282 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc);
283 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points);
284 (*jnienv)->DeleteLocalRef(jnienv, points);
288 draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h)
291 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h);
295 draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r)
298 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r);
303 draw_text(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy)
305 dbg(1,"enter %s\n", text);
307 jstring string = (*jnienv)->NewStringUTF(jnienv, text);
308 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy);
309 (*jnienv)->DeleteLocalRef(jnienv, string);
313 draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img)
315 dbg(1,"enter %p\n",img);
317 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap);
322 draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data)
327 draw_restore(struct graphics_priv *gr, struct point *p, int w, int h)
331 static void draw_drag(struct graphics_priv *gra, struct point *p)
333 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0);
337 background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc)
342 draw_mode(struct graphics_priv *gra, enum draw_mode_num mode)
344 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode);
347 static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound);
350 get_data(struct graphics_priv *this, char *type)
352 if (strcmp(type,"window"))
357 static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv)
359 (*jnienv)->DeleteGlobalRef(jnienv, priv->Bitmap);
363 static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate)
365 int len = g_utf8_strlen(text, -1);
368 int yMax = 13*font->size/256;
369 int xMax = 9*font->size*len/256;
381 static void overlay_disable(struct graphics_priv *gra, int disable)
383 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable);
386 static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound)
388 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound);
392 set_attr(struct graphics_priv *gra, struct attr *attr)
394 switch (attr->type) {
395 case attr_use_camera:
396 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num);
403 static struct graphics_methods graphics_methods = {
429 resize_callback(struct graphics_priv *gra, int w, int h)
431 dbg(0,"w=%d h=%d ok\n",w,h);
432 callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h);
436 motion_callback(struct graphics_priv *gra, int x, int y)
441 callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p);
445 keypress_callback(struct graphics_priv *gra, char *s)
447 dbg(0,"enter %s\n",s);
448 callback_list_call_attr_1(gra->cbl, attr_keypress, s);
452 button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y)
457 callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p);
462 set_activity(jobject graphics)
464 jclass ActivityClass;
467 ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity);
469 if (ActivityClass == NULL) {
470 dbg(0,"no activity class found\n");
474 cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V");
476 dbg(0,"no setContentView method found\n");
480 (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics);
486 graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int alpha, int wraparound, int use_camera)
491 dbg(0,"at 2 jnienv=%p\n",jnienv);
492 if (!find_class_global("android/graphics/Paint", &ret->PaintClass))
494 if (!find_method(ret->PaintClass, "<init>", "()V", &ret->Paint_init))
496 if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB))
498 if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth))
501 if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass))
503 if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile))
505 if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource))
508 if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass))
510 if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight))
512 if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth))
515 if (!find_class_global("android/content/Context", &ret->ContextClass))
517 if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources))
521 ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources);
523 (*jnienv)->NewGlobalRef(jnienv, ret->Resources);
524 if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass))
526 if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier))
529 if (!find_class_global("org/navitproject/navit/NavitGraphics", &ret->NavitGraphicsClass))
532 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", "(Landroid/app/Activity;Lorg/navitproject/navit/NavitGraphics;IIIIIII)V");
534 dbg(0,"no method found\n");
535 return 0; /* exception thrown */
537 dbg(0,"at 4 android_activity=%p\n",android_activity);
538 ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound, use_camera);
539 dbg(0,"result=%p\n",ret->NavitGraphics);
540 if (ret->NavitGraphics)
541 (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics);
543 /* Create a single global Paint, otherwise android will quickly run out
545 ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init);
546 dbg(0,"result=%p\n",ret->Paint);
548 (*jnienv)->NewGlobalRef(jnienv, ret->Paint);
550 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V");
552 dbg(0,"no SetResizeCallback method found\n");
553 return 0; /* exception thrown */
555 cb=callback_new_1(callback_cast(resize_callback), ret);
556 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
558 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V");
560 dbg(0,"no SetButtonCallback method found\n");
561 return 0; /* exception thrown */
563 cb=callback_new_1(callback_cast(button_callback), ret);
564 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
566 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V");
568 dbg(0,"no SetMotionCallback method found\n");
569 return 0; /* exception thrown */
571 cb=callback_new_1(callback_cast(motion_callback), ret);
572 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
574 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V");
576 dbg(0,"no SetKeypressCallback method found\n");
577 return 0; /* exception thrown */
579 cb=callback_new_1(callback_cast(keypress_callback), ret);
580 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
582 if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline))
584 if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon))
586 if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle))
588 if (!find_method(ret->NavitGraphicsClass, "draw_circle", "(Landroid/graphics/Paint;III)V", &ret->NavitGraphics_draw_circle))
590 if (!find_method(ret->NavitGraphicsClass, "draw_text", "(Landroid/graphics/Paint;IILjava/lang/String;III)V", &ret->NavitGraphics_draw_text))
592 if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image))
594 if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode))
596 if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag))
598 if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable))
600 if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize))
602 if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera))
605 set_activity(ret->NavitGraphics);
611 graphics_android_fullscreen(struct window *win, int on)
616 static jclass NavitClass;
617 static jmethodID Navit_disableSuspend, Navit_exit;
620 graphics_android_disable_suspend(struct window *win)
623 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend);
628 static struct graphics_priv *
629 graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)
631 struct graphics_priv *ret;
634 if (!event_request_system("android","graphics_android"))
636 ret=g_new0(struct graphics_priv, 1);
639 *meth=graphics_methods;
641 ret->win.fullscreen=graphics_android_fullscreen;
642 ret->win.disable_suspend=graphics_android_disable_suspend;
643 if ((attr=attr_search(attrs, NULL, attr_use_camera))) {
644 use_camera=attr->u.num;
646 if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, 0, use_camera)) {
647 dbg(0,"returning %p\n",ret);
655 static struct graphics_priv *
656 overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound)
658 struct graphics_priv *ret=g_new0(struct graphics_priv, 1);
659 *meth=graphics_methods;
660 if (graphics_android_init(ret, gr, p, w, h, alpha, wraparound, 0)) {
661 dbg(0,"returning %p\n",ret);
671 event_android_main_loop_run(void)
676 static void event_android_main_loop_quit(void)
679 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit);
683 static jclass NavitTimeoutClass;
684 static jmethodID NavitTimeout_init;
685 static jmethodID NavitTimeout_remove;
687 static jclass NavitIdleClass;
688 static jmethodID NavitIdle_init;
689 static jmethodID NavitIdle_remove;
691 static jclass NavitWatchClass;
692 static jmethodID NavitWatch_init;
693 static jmethodID NavitWatch_remove;
695 static struct event_watch *
696 event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb)
699 ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int) h, (int) cond, (int)cb);
700 dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret);
702 (*jnienv)->NewGlobalRef(jnienv, ret);
703 return (struct event_watch *)ret;
707 event_android_remove_watch(struct event_watch *ev)
709 dbg(0,"enter %p\n",ev);
711 jobject obj=(jobject )ev;
712 (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove);
713 (*jnienv)->DeleteGlobalRef(jnienv, obj);
717 static struct event_timeout *
718 event_android_add_timeout(int timeout, int multi, struct callback *cb)
721 ret=(*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)cb);
722 dbg(1,"result for %d,%d,%p=%p\n",timeout,multi,cb,ret);
724 (*jnienv)->NewGlobalRef(jnienv, ret);
725 return (struct event_timeout *)ret;
729 event_android_remove_timeout(struct event_timeout *to)
731 dbg(1,"enter %p\n",to);
733 jobject obj=(jobject )to;
734 (*jnienv)->CallVoidMethod(jnienv, obj, NavitTimeout_remove);
735 (*jnienv)->DeleteGlobalRef(jnienv, obj);
740 static struct event_idle *
741 event_android_add_idle(int priority, struct callback *cb)
746 ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb);
747 dbg(1,"result for %p=%p\n",cb,ret);
749 (*jnienv)->NewGlobalRef(jnienv, ret);
750 return (struct event_idle *)ret;
752 return (struct event_idle *)event_android_add_timeout(1, 1, cb);
756 event_android_remove_idle(struct event_idle *ev)
759 dbg(1,"enter %p\n",ev);
761 jobject obj=(jobject )ev;
762 (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove);
763 (*jnienv)->DeleteGlobalRef(jnienv, obj);
766 event_android_remove_timeout((struct event_timeout *)ev);
770 event_android_call_callback(struct callback_list *cb)
775 static struct event_methods event_android_methods = {
776 event_android_main_loop_run,
777 event_android_main_loop_quit,
778 event_android_add_watch,
779 event_android_remove_watch,
780 event_android_add_timeout,
781 event_android_remove_timeout,
782 event_android_add_idle,
783 event_android_remove_idle,
784 event_android_call_callback,
787 static struct event_priv *
788 event_android_new(struct event_methods *meth)
791 if (!find_class_global("org/navitproject/navit/NavitTimeout", &NavitTimeoutClass))
793 NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "<init>", "(IZI)V");
794 if (NavitTimeout_init == NULL)
796 NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V");
797 if (NavitTimeout_remove == NULL)
800 if (!find_class_global("org/navitproject/navit/NavitIdle", &NavitIdleClass))
802 NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "<init>", "(I)V");
803 if (NavitIdle_init == NULL)
805 NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V");
806 if (NavitIdle_remove == NULL)
810 if (!find_class_global("org/navitproject/navit/NavitWatch", &NavitWatchClass))
812 NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(III)V");
813 if (NavitWatch_init == NULL)
815 NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V");
816 if (NavitWatch_remove == NULL)
819 if (!find_class_global("org/navitproject/navit/Navit", &NavitClass))
821 Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V");
822 if (Navit_disableSuspend == NULL)
824 Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V");
825 if (Navit_exit == NULL)
828 *meth=event_android_methods;
837 plugin_register_graphics_type("android", graphics_android_new);
838 plugin_register_event_type("android", event_android_new);