/[zanavi_public1]/navit/navit/graphics/android/graphics_android.c
ZANavi

Diff of /navit/navit/graphics/android/graphics_android.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 27 Revision 31
49#include "callback.h" 49#include "callback.h"
50#include "android.h" 50#include "android.h"
51 51
52int dummy; 52int dummy;
53 53
54jclass NavitClass2 = NULL;
55jmethodID Navit_get_graphics_object_by_name;
56
54struct graphics_priv 57struct graphics_priv
55{ 58{
56 jclass NavitGraphicsClass; 59 jclass NavitGraphicsClass;
57 jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polyline2, NavitGraphics_draw_polyline3, NavitGraphics_draw_polyline4, NavitGraphics_draw_polyline_dashed, NavitGraphics_set_dashes, NavitGraphics_draw_polygon, NavitGraphics_draw_polygon2, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, 60 jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polyline2, NavitGraphics_draw_polyline3, NavitGraphics_draw_polyline4, NavitGraphics_draw_polyline_dashed, NavitGraphics_set_dashes, NavitGraphics_draw_polygon, NavitGraphics_draw_polygon2, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image,
58 NavitGraphics_draw_bigmap, NavitGraphics_send_osd_values, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera, NavitGraphicsClass_rotate_and_scale_bitmap; 61 NavitGraphics_draw_bigmap, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera, NavitGraphicsClass_rotate_and_scale_bitmap;
59 62
60 jclass PaintClass; 63 jclass PaintClass;
61 jmethodID Paint_init, Paint_setStrokeWidth, Paint_setARGB; 64 jmethodID Paint_init, Paint_setStrokeWidth, Paint_setARGB;
62 65
63 jobject NavitGraphics; 66 jobject NavitGraphics;
103 106
104static GHashTable *image_cache_hash = NULL; 107static GHashTable *image_cache_hash = NULL;
105 108
106static int find_class_global(char *name, jclass *ret) 109static int find_class_global(char *name, jclass *ret)
107{ 110{
108 //DBG dbg(0,"EEnter\n"); 111 //DBG // dbg(0,"EEnter\n");
112 JNIEnv *jnienv2;
113 jnienv2 = jni_getenv();
114
109 *ret = (*jnienv)->FindClass(jnienv, name); 115 *ret = (*jnienv2)->FindClass(jnienv2, name);
110 if (!*ret) 116 if (!*ret)
111 { 117 {
112 //DBG dbg(0, "Failed to get Class %s\n", name); 118 //DBG // dbg(0, "Failed to get Class %s\n", name);
113 return 0; 119 return 0;
114 } 120 }
115 *ret = (*jnienv)->NewGlobalRef(jnienv, *ret); 121 *ret = (*jnienv2)->NewGlobalRef(jnienv2, *ret);
116 return 1; 122 return 1;
117} 123}
118 124
119static int find_method(jclass class, char *name, char *args, jmethodID *ret) 125static int find_method(jclass class, char *name, char *args, jmethodID *ret)
120{ 126{
127 JNIEnv *jnienv2;
128 jnienv2 = jni_getenv();
129
121 //DBG dbg(0,"EEnter\n"); 130 //DBG // dbg(0,"EEnter\n");
122 *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); 131 *ret = (*jnienv2)->GetMethodID(jnienv2, class, name, args);
123 if (*ret == NULL) 132 if (*ret == NULL)
124 { 133 {
125 //DBG dbg(0, "Failed to get Method %s with signature %s\n", name, args); 134 //DBG // dbg(0, "Failed to get Method %s with signature %s\n", name, args);
126 return 0; 135 return 0;
127 } 136 }
128 return 1; 137 return 1;
129} 138}
130 139
131static int find_static_method(jclass class, char *name, char *args, jmethodID *ret) 140static int find_static_method(jclass class, char *name, char *args, jmethodID *ret)
132{ 141{
142 JNIEnv *jnienv2;
143 jnienv2 = jni_getenv();
144
133 //DBG dbg(0,"EEnter\n"); 145 //DBG // dbg(0,"EEnter\n");
134 *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args); 146 *ret = (*jnienv2)->GetStaticMethodID(jnienv2, class, name, args);
135 if (*ret == NULL) 147 if (*ret == NULL)
136 { 148 {
137 //DBG dbg(0, "Failed to get static Method %s with signature %s\n", name, args); 149 //DBG // dbg(0, "Failed to get static Method %s with signature %s\n", name, args);
138 return 0; 150 return 0;
139 } 151 }
140 return 1; 152 return 1;
141} 153}
142 154
161 return ret; 173 return ret;
162} 174}
163 175
164static void gc_destroy(struct graphics_gc_priv *gc) 176static void gc_destroy(struct graphics_gc_priv *gc)
165{ 177{
166 //DBG dbg(0,"EEnter\n"); 178 //DBG // dbg(0,"EEnter\n");
167 179
168 g_free(gc); 180 g_free(gc);
169} 181}
170 182
171static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) 183static void gc_set_linewidth(struct graphics_gc_priv *gc, int w)
172{ 184{
173 gc->linewidth = w; 185 gc->linewidth = w;
174} 186}
175 187
188
189// UNUSED --------------
176static void gc_set_dashes(struct graphics_priv *gra, struct graphics_gc_priv *gc, int w, int offset, int dash_list[], int order) 190static void gc_set_dashes(struct graphics_priv *gra, struct graphics_gc_priv *gc, int w, int offset, int dash_list[], int order)
177{ 191{
192 //JNIEnv *jnienv2;
193 //jnienv2 = jni_getenv();
178 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_set_dashes, gc->gra->Paint, dash_list[0], order); 194 //(*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_set_dashes, gc->gra->Paint, dash_list[0], order);
179} 195}
196
180 197
181static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) 198static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c)
182{ 199{
183 gc->r = c->r >> 8; 200 gc->r = c->r >> 8;
184 gc->g = c->g >> 8; 201 gc->g = c->g >> 8;
193static struct graphics_gc_methods gc_methods = 210static struct graphics_gc_methods gc_methods =
194{ gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background }; 211{ gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background };
195 212
196static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) 213static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth)
197{ 214{
198 ////DBG dbg(0,"EEnter\n"); 215 ////DBG // dbg(0,"EEnter\n");
199 216
200 struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); 217 struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1);
201 *meth = gc_methods; 218 *meth = gc_methods;
202 219
203 ret->gra = gr; 220 ret->gra = gr;
215{ image_destroy }; 232{ image_destroy };
216 233
217static struct graphics_image_priv * 234static struct graphics_image_priv *
218image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) 235image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation)
219{ 236{
220 //DBG dbg(0,"EEnter\n"); 237 //DBG // dbg(0,"EEnter\n");
238
239 JNIEnv *jnienv2;
240 jnienv2 = jni_getenv();
241
242 int thread_id = gettid();
243 // dbg(0, "THREAD ID=%d\n", thread_id);
244
221 245
222 struct graphics_image_priv* ret = NULL; 246 struct graphics_image_priv* ret = NULL;
223 247
224 if (!g_hash_table_lookup_extended(image_cache_hash, path, NULL, (gpointer) & ret)) 248 if (!g_hash_table_lookup_extended(image_cache_hash, path, NULL, (gpointer) & ret))
225 { 249 {
228 int id; 252 int id;
229 253
230 // // dbg(1, "enter %s\n", path); 254 // // dbg(1, "enter %s\n", path);
231 if (!strncmp(path, "res/drawable/", 13)) 255 if (!strncmp(path, "res/drawable/", 13))
232 { 256 {
233 jstring a = (*jnienv)->NewStringUTF(jnienv, "drawable"); 257 jstring a = (*jnienv2)->NewStringUTF(jnienv2, "drawable");
234 jstring b = (*jnienv)->NewStringUTF(jnienv, "com.zoffcc.applications.zanavi"); 258 jstring b = (*jnienv2)->NewStringUTF(jnienv2, "com.zoffcc.applications.zanavi");
235 char *path_noext = g_strdup(path + 13); 259 char *path_noext = g_strdup(path + 13);
236 char *pos = strrchr(path_noext, '.'); 260 char *pos = strrchr(path_noext, '.');
237 if (pos) 261 if (pos)
238 *pos = '\0'; 262 *pos = '\0';
239 //DBG dbg(0, "path_noext=%s\n", path_noext); 263 //DBG // dbg(0, "path_noext=%s\n", path_noext);
240 string = (*jnienv)->NewStringUTF(jnienv, path_noext); 264 string = (*jnienv2)->NewStringUTF(jnienv2, path_noext);
241 g_free(path_noext); 265 g_free(path_noext);
242 id = (*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, b); 266 id = (*jnienv2)->CallIntMethod(jnienv2, gra->Resources, gra->Resources_getIdentifier, string, a, b);
243 //DBG dbg(0, "id=%d\n", id); 267 //DBG // dbg(0, "id=%d\n", id);
244 //DBG dbg(0,"JNI\n"); 268 //DBG // dbg(0,"JNI\n");
245 if (id) 269 if (id)
246 { 270 {
247 ret->Bitmap = (*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); 271 ret->Bitmap = (*jnienv2)->CallStaticObjectMethod(jnienv2, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id);
248 } 272 }
249 (*jnienv)->DeleteLocalRef(jnienv, b); 273 (*jnienv2)->DeleteLocalRef(jnienv2, b);
250 (*jnienv)->DeleteLocalRef(jnienv, a); 274 (*jnienv2)->DeleteLocalRef(jnienv2, a);
251 } 275 }
252 else 276 else
253 { 277 {
254 string = (*jnienv)->NewStringUTF(jnienv, path); 278 string = (*jnienv2)->NewStringUTF(jnienv2, path);
255 //DBG dbg(0,"JNI\n"); 279 //DBG // dbg(0,"JNI\n");
256 ret->Bitmap = (*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); 280 ret->Bitmap = (*jnienv2)->CallStaticObjectMethod(jnienv2, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string);
257 // there should be a check here, if we really want any rotation/scaling 281 // there should be a check here, if we really want any rotation/scaling
258 // otherwise the call is overkill 282 // otherwise the call is overkill
259 //DBG dbg(0,"JNI\n"); 283 //DBG // dbg(0,"JNI\n");
260 ret->Bitmap = (*jnienv)->CallStaticObjectMethod(jnienv, gra->NavitGraphicsClass, gra->NavitGraphicsClass_rotate_and_scale_bitmap, ret->Bitmap, *w, *h, rotation); 284 ret->Bitmap = (*jnienv2)->CallStaticObjectMethod(jnienv2, gra->NavitGraphicsClass, gra->NavitGraphicsClass_rotate_and_scale_bitmap, ret->Bitmap, *w, *h, rotation);
261 } 285 }
262 //// dbg(1, "result=%p\n", ret->Bitmap); 286 //// dbg(1, "result=%p\n", ret->Bitmap);
263 if (ret->Bitmap) 287 if (ret->Bitmap)
264 { 288 {
265 //DBG dbg(0,"JNI\n"); 289 //DBG // dbg(0,"JNI\n");
266 ret->Bitmap = (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap); 290 ret->Bitmap = (*jnienv2)->NewGlobalRef(jnienv2, ret->Bitmap);
267 // ICS (*jnienv)->DeleteLocalRef(jnienv, ret->Bitmap); 291 // ICS (*jnienv2)->DeleteLocalRef(jnienv2, ret->Bitmap);
268 //DBG dbg(0,"JNI\n"); 292 //DBG // dbg(0,"JNI\n");
269 ret->width = (*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth); 293 ret->width = (*jnienv2)->CallIntMethod(jnienv2, ret->Bitmap, gra->Bitmap_getWidth);
270 //DBG dbg(0,"JNI\n"); 294 //DBG // dbg(0,"JNI\n");
271 ret->height = (*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight); 295 ret->height = (*jnienv2)->CallIntMethod(jnienv2, ret->Bitmap, gra->Bitmap_getHeight);
272 //// dbg(1, "w=%d h=%d for %s\n", ret->width, ret->height, path); 296 //// dbg(1, "w=%d h=%d for %s\n", ret->width, ret->height, path);
273 ret->hot.x = ret->width / 2; 297 ret->hot.x = ret->width / 2;
274 ret->hot.y = ret->height / 2; 298 ret->hot.y = ret->height / 2;
275 } 299 }
276 else 300 else
277 { 301 {
278 g_free(ret); 302 g_free(ret);
279 ret = NULL; 303 ret = NULL;
280 //DBG dbg(0, "Failed to open %s\n", path); 304 //DBG // dbg(0, "Failed to open %s\n", path);
281 } 305 }
282 //DBG dbg(0,"JNI\n"); 306 //DBG // dbg(0,"JNI\n");
283 (*jnienv)->DeleteLocalRef(jnienv, string); 307 (*jnienv2)->DeleteLocalRef(jnienv2, string);
284 //DBG dbg(0,"JNI\n"); 308 //DBG // dbg(0,"JNI\n");
285 g_hash_table_insert(image_cache_hash, g_strdup(path), (gpointer) ret); 309 g_hash_table_insert(image_cache_hash, g_strdup(path), (gpointer) ret);
286 } 310 }
287 if (ret) 311 if (ret)
288 { 312 {
289 *w = ret->width; 313 *w = ret->width;
297 return ret; 321 return ret;
298} 322}
299 323
300static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc) 324static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc)
301{ 325{
302 //DBG dbg(0,"EEnter\n"); 326 //DBG // dbg(0,"EEnter\n");
327
328 JNIEnv *jnienv2;
329 jnienv2 = jni_getenv();
303 330
304 float wf = gc->linewidth; 331 float wf = gc->linewidth;
305 (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setStrokeWidth, wf); 332 (*jnienv2)->CallVoidMethod(jnienv2, gc->gra->Paint, gra->Paint_setStrokeWidth, wf);
306 (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b); 333 (*jnienv2)->CallVoidMethod(jnienv2, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b);
307} 334}
308 335
309static void draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) 336static void draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
310{ 337{
311 //DBG dbg(0,"EEnter\n"); 338 //DBG // dbg(0,"EEnter\n");
339 jint pc[count * 2];
340 int i;
341 jintArray points;
342
343 if (count <= 0)
344 return;
345
346 JNIEnv *jnienv2;
347 jnienv2 = jni_getenv();
348
349 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
350 for (i = 0; i < count; i++)
351 {
352 pc[i * 2] = p[i].x;
353 pc[i * 2 + 1] = p[i].y;
354 }
355 initPaint(gra, gc);
356 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
357 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points);
358 (*jnienv2)->DeleteLocalRef(jnienv2, points);
359}
360
361static void draw_lines3(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int width, int dashes, struct color *c)
362{
363 //DBG // dbg(0,"EEnter\n");
364 jint pc[count * 2];
365 int i;
366 jintArray points;
367 if (count <= 0)
368 {
369 return;
370 }
371
372 JNIEnv *jnienv2;
373 jnienv2 = jni_getenv();
374
375 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
376 for (i = 0; i < count; i++)
377 {
378 pc[i * 2] = p[i].x;
379 pc[i * 2 + 1] = p[i].y;
380 }
381 //initPaint(gra, gc);
382 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
383 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline3, points, order, width, dashes, c->r >> 8, c->g >> 8, c->b >> 8, c->a >> 8);
384 (*jnienv2)->DeleteLocalRef(jnienv2, points);
385}
386
387static void draw_lines4(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int width, int type, int dashes, struct color *c)
388{
389 //DBG // dbg(0,"EEnter\n");
390
391 // draw tunnel-street or bridge-street
392 // type:1 -> tunnel
393 // type:2 -> bridge
394 // ------------------------------------------
395 // type > 90 -> some signal (not a real line)
396
397 JNIEnv *jnienv2;
398 jnienv2 = jni_getenv();
399
400
401 if (type > 90)
402 {
403 // "***" signal
404 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline4, NULL, order, width, type, 0, 0, 0, 0, 0);
405 }
406 else
407 {
408 jint pc[count * 2];
409 int i;
410 jintArray points;
411 if (count <= 0)
412 {
413 return;
414 }
415 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
416 for (i = 0; i < count; i++)
417 {
418 pc[i * 2] = p[i].x;
419 pc[i * 2 + 1] = p[i].y;
420 }
421 // initPaint(gra, gc);
422 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
423 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline4, points, order, width, type, dashes, c->r >> 8, c->g >> 8, c->b >> 8, c->a >> 8);
424 (*jnienv2)->DeleteLocalRef(jnienv2, points);
425 }
426}
427
428static void draw_lines2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
429{
430 //DBG // dbg(0,"EEnter\n");
312 jint pc[count * 2]; 431 jint pc[count * 2];
313 int i; 432 int i;
314 jintArray points; 433 jintArray points;
315 if (count <= 0) 434 if (count <= 0)
316 return; 435 return;
436
437 JNIEnv *jnienv2;
438 jnienv2 = jni_getenv();
439
317 points = (*jnienv)->NewIntArray(jnienv, count * 2); 440 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
318 for (i = 0; i < count; i++) 441 for (i = 0; i < count; i++)
319 { 442 {
320 pc[i * 2] = p[i].x; 443 pc[i * 2] = p[i].x;
321 pc[i * 2 + 1] = p[i].y; 444 pc[i * 2 + 1] = p[i].y;
322 } 445 }
323 initPaint(gra, gc); 446 initPaint(gra, gc);
324 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count * 2, pc); 447 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
325 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points); 448 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline2, gc->gra->Paint, points, order, oneway);
326 (*jnienv)->DeleteLocalRef(jnienv, points); 449 (*jnienv2)->DeleteLocalRef(jnienv2, points);
327} 450}
328 451
329static void draw_lines3(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int width) 452static void draw_lines_dashed(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
330{ 453{
331 //DBG dbg(0,"EEnter\n");
332 jint pc[count * 2]; 454 jint pc[count * 2];
333 int i; 455 int i;
334 jintArray points; 456 jintArray points;
335 if (count <= 0) 457 if (count <= 0)
336 return; 458 return;
459
460 JNIEnv *jnienv2;
461 jnienv2 = jni_getenv();
462
337 points = (*jnienv)->NewIntArray(jnienv, count * 2); 463 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
338 for (i = 0; i < count; i++) 464 for (i = 0; i < count; i++)
339 { 465 {
340 pc[i * 2] = p[i].x; 466 pc[i * 2] = p[i].x;
341 pc[i * 2 + 1] = p[i].y; 467 pc[i * 2 + 1] = p[i].y;
342 } 468 }
343 initPaint(gra, gc); 469 initPaint(gra, gc);
344 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count * 2, pc); 470 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
345 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline3, gc->gra->Paint, points, order, width); 471 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline_dashed, gc->gra->Paint, points, order, oneway);
346 (*jnienv)->DeleteLocalRef(jnienv, points); 472 (*jnienv2)->DeleteLocalRef(jnienv2, points);
347} 473}
348 474
349static void draw_lines4(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int width, int type)
350{
351 //DBG dbg(0,"EEnter\n");
352
353 // draw tunnel-street or bridge-street
354 // type:1 -> tunnel
355 // type:2 -> bridge
356
357 jint pc[count * 2];
358 int i;
359 jintArray points;
360 if (count <= 0)
361 {
362 return;
363 }
364 points = (*jnienv)->NewIntArray(jnienv, count * 2);
365 for (i = 0; i < count; i++)
366 {
367 pc[i * 2] = p[i].x;
368 pc[i * 2 + 1] = p[i].y;
369 }
370 initPaint(gra, gc);
371 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count * 2, pc);
372 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline4, gc->gra->Paint, points, order, width, type);
373 (*jnienv)->DeleteLocalRef(jnienv, points);
374}
375
376static void draw_lines2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway) 475static void draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
377{ 476{
378 //DBG dbg(0,"EEnter\n");
379 jint pc[count * 2]; 477 jint pc[count * 2];
380 int i; 478 int i;
381 jintArray points; 479 jintArray points;
382 if (count <= 0) 480 if (count <= 0)
383 return; 481 return;
482
483 JNIEnv *jnienv2;
484 jnienv2 = jni_getenv();
485
384 points = (*jnienv)->NewIntArray(jnienv, count * 2); 486 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
385 for (i = 0; i < count; i++) 487 for (i = 0; i < count; i++)
386 { 488 {
387 pc[i * 2] = p[i].x; 489 pc[i * 2] = p[i].x;
388 pc[i * 2 + 1] = p[i].y; 490 pc[i * 2 + 1] = p[i].y;
389 } 491 }
390 initPaint(gra, gc); 492 initPaint(gra, gc);
391 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count * 2, pc); 493 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
392 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline2, gc->gra->Paint, points, order, oneway); 494 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points);
393 (*jnienv)->DeleteLocalRef(jnienv, points); 495 (*jnienv2)->DeleteLocalRef(jnienv2, points);
394} 496}
395 497
396static void draw_lines_dashed(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway) 498static void draw_polygon2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
397{ 499{
398 jint pc[count * 2]; 500 jint pc[count * 2];
399 int i; 501 int i;
400 jintArray points; 502 jintArray points;
401 if (count <= 0) 503 if (count <= 0)
402 return; 504 return;
505
506 JNIEnv *jnienv2;
507 jnienv2 = jni_getenv();
508
403 points = (*jnienv)->NewIntArray(jnienv, count * 2); 509 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
404 for (i = 0; i < count; i++) 510 for (i = 0; i < count; i++)
405 { 511 {
406 pc[i * 2] = p[i].x; 512 pc[i * 2] = p[i].x;
407 pc[i * 2 + 1] = p[i].y; 513 pc[i * 2 + 1] = p[i].y;
408 } 514 }
409 initPaint(gra, gc); 515 initPaint(gra, gc);
410 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count * 2, pc); 516 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
411 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline_dashed, gc->gra->Paint, points, order, oneway); 517 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polygon2, gc->gra->Paint, points, order, oneway);
412 (*jnienv)->DeleteLocalRef(jnienv, points); 518 (*jnienv2)->DeleteLocalRef(jnienv2, points);
413} 519}
414 520
415static void draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) 521static void draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h)
416{ 522{
417 jint pc[count * 2]; 523 JNIEnv *jnienv2;
418 int i; 524 jnienv2 = jni_getenv();
419 jintArray points; 525
420 if (count <= 0)
421 return;
422 points = (*jnienv)->NewIntArray(jnienv, count * 2);
423 for (i = 0; i < count; i++)
424 {
425 pc[i * 2] = p[i].x;
426 pc[i * 2 + 1] = p[i].y;
427 }
428 initPaint(gra, gc); 526 initPaint(gra, gc);
429 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count * 2, pc);
430 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points); 527 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h);
431 (*jnienv)->DeleteLocalRef(jnienv, points);
432} 528}
433 529
434static void draw_polygon2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway) 530static void draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r)
435{ 531{
436 jint pc[count * 2]; 532 JNIEnv *jnienv2;
437 int i; 533 jnienv2 = jni_getenv();
438 jintArray points; 534
439 if (count <= 0)
440 return;
441 points = (*jnienv)->NewIntArray(jnienv, count * 2);
442 for (i = 0; i < count; i++)
443 {
444 pc[i * 2] = p[i].x;
445 pc[i * 2 + 1] = p[i].y;
446 }
447 initPaint(gra, gc); 535 initPaint(gra, gc);
448 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count * 2, pc);
449 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon2, gc->gra->Paint, points, order, oneway);
450 (*jnienv)->DeleteLocalRef(jnienv, points);
451}
452
453static void draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h)
454{
455 initPaint(gra, gc);
456 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h);
457}
458
459static void draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r)
460{
461 initPaint(gra, gc);
462 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r); 536 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r);
463} 537}
464 538
465static void 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) 539static void 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)
466{ 540{
467 //// dbg(1, "enter %s\n", text); 541 //// dbg(1, "enter %s\n", text);
542 JNIEnv *jnienv2;
543 jnienv2 = jni_getenv();
544
468 initPaint(gra, fg); 545 initPaint(gra, fg);
469 jstring string = (*jnienv)->NewStringUTF(jnienv, text); 546 jstring string = (*jnienv2)->NewStringUTF(jnienv2, text);
470 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy); 547 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy);
471 (*jnienv)->DeleteLocalRef(jnienv, string); 548 (*jnienv2)->DeleteLocalRef(jnienv2, string);
472} 549}
473 550
474static void draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) 551static void draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img)
475{ 552{
476 //DBG dbg(0,"EEnter\n"); 553 //DBG // dbg(0,"EEnter\n");
554
555 JNIEnv *jnienv2;
556 jnienv2 = jni_getenv();
477 557
478 //// dbg(1, "enter %p\n", img); 558 //// dbg(1, "enter %p\n", img);
479 initPaint(gra, fg); 559 initPaint(gra, fg);
480 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap); 560 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap);
481 561
482} 562}
483 563
484static void draw_bigmap(struct graphics_priv *gra, struct graphics_gc_priv *fg, int yaw, int order, float clat, float clng, int x, int y, int scx, int scy, int px, int py, int valid) 564static void draw_bigmap(struct graphics_priv *gra, struct graphics_gc_priv *fg, int yaw, int order, float clat, float clng, int x, int y, int scx, int scy, int px, int py, int valid)
485{ 565{
486 //DBG dbg(0,"EEnter\n"); 566 //DBG // dbg(0,"EEnter\n");
487 567
568 JNIEnv *jnienv2;
569 jnienv2 = jni_getenv();
570
488 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_bigmap, yaw, order, clat, clng, x, y, scx, scy, px, py, valid); 571 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_bigmap, yaw, order, clat, clng, x, y, scx, scy, px, py, valid);
489 572
490 //DBG dbg(0,"leave\n"); 573 //DBG // dbg(0,"leave\n");
491}
492
493static void send_osd_values(struct graphics_priv *gra, struct graphics_gc_priv *fg, char *id, char *text1, char *text2, char *text3, int i1, int i2, int i3, int i4, float f1, float f2, float f3)
494{
495 //DBG dbg(0,"EEnter\n");
496
497 jstring string1 = (*jnienv)->NewStringUTF(jnienv, id);
498 jstring string2 = (*jnienv)->NewStringUTF(jnienv, text1);
499 jstring string3 = (*jnienv)->NewStringUTF(jnienv, text2);
500 jstring string4 = (*jnienv)->NewStringUTF(jnienv, text3);
501 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_send_osd_values, string1, string2, string3, string4, i1, i2, i3, i4, f1, f2, f3);
502 (*jnienv)->DeleteLocalRef(jnienv, string1);
503 (*jnienv)->DeleteLocalRef(jnienv, string2);
504 (*jnienv)->DeleteLocalRef(jnienv, string3);
505 (*jnienv)->DeleteLocalRef(jnienv, string4);
506} 574}
507 575
508static void draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) 576static void draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data)
509{ 577{
510} 578}
513{ 581{
514} 582}
515 583
516static void draw_drag(struct graphics_priv *gra, struct point *p) 584static void draw_drag(struct graphics_priv *gra, struct point *p)
517{ 585{
518 //DBG dbg(0,"EEnter\n"); 586 //DBG // dbg(0,"EEnter\n");
587 JNIEnv *jnienv2;
588 jnienv2 = jni_getenv();
519 589
520 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0); 590 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0);
521} 591}
522 592
523static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) 593static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc)
524{ 594{
525} 595}
526 596
527static void draw_mode(struct graphics_priv *gra, enum draw_mode_num mode) 597static void draw_mode(struct graphics_priv *gra, enum draw_mode_num mode)
528{ 598{
529 //DBG dbg(0,"EEnter\n"); 599 //DBG // dbg(0,"EEnter\n");
600 JNIEnv *jnienv2;
601 jnienv2 = jni_getenv();
530 602
531 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int) mode); 603 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int) mode);
532} 604}
533 605
534static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); 606static struct graphics_priv * overlay_new(const char* name, struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound);
535 607
536static void * 608static void *
537get_data(struct graphics_priv *this, const char *type) 609get_data(struct graphics_priv *this, const char *type)
538{ 610{
539 //DBG dbg(0,"EEnter\n"); 611 //DBG // dbg(0,"EEnter\n");
540 612
541 if (strcmp(type, "window")) 613 if (strcmp(type, "window"))
614 {
542 return NULL; 615 return NULL;
616 }
617
543 return &this->win; 618 return &this->win;
544} 619}
545 620
546static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) 621static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv)
547{ 622{
548} 623}
549 624
550static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) 625static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate)
551{ 626{
552 ////DBG dbg(0,"EEnter\n"); 627 ////DBG // dbg(0,"EEnter\n");
628
629 // this is a rough estimate!! otherwise java methods would be called, and thats too slow!
553 630
554 int len = g_utf8_strlen(text, -1); 631 int len = g_utf8_strlen(text, -1);
555 int xMin = 0; 632 int xMin = 0;
556 int yMin = 0; 633 int yMin = 0;
557 int yMax = 13 * font->size / 256; 634 int yMax = 13 * font->size / 256;
567 ret[3].y = -yMin; 644 ret[3].y = -yMin;
568} 645}
569 646
570static void overlay_disable(struct graphics_priv *gra, int disable) 647static void overlay_disable(struct graphics_priv *gra, int disable)
571{ 648{
649 // UNUSED ----
650
572 //DBG dbg(0,"EEnter\n"); 651 //DBG // dbg(0,"EEnter\n");
652 //JNIEnv *jnienv2;
653 //jnienv2 = jni_getenv();
654 //
573 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable); 655 //(*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable);
574} 656}
575 657
576static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound) 658static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound)
577{ 659{
660 // UNUSED ----
661
578 //DBG dbg(0,"EEnter\n"); 662 //DBG // dbg(0,"EEnter\n");
663 //JNIEnv *jnienv2;
664 //jnienv2 = jni_getenv();
665 //
579 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x : 0, pnt ? pnt->y : 0, w, h, alpha, wraparound); 666 //(*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x : 0, pnt ? pnt->y : 0, w, h, alpha, wraparound);
580} 667}
581 668
582static int set_attr(struct graphics_priv *gra, struct attr *attr) 669static int set_attr(struct graphics_priv *gra, struct attr *attr)
583{ 670{
584 //DBG dbg(0,"EEnter\n"); 671 //DBG // dbg(0,"EEnter\n");
672 JNIEnv *jnienv2;
673 jnienv2 = jni_getenv();
674
585 switch (attr->type) 675 switch (attr->type)
586 { 676 {
587 case attr_use_camera: 677 case attr_use_camera:
588 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); 678 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num);
589 return 1; 679 return 1;
590 default: 680 default:
591 return 0; 681 return 0;
592 } 682 }
593} 683}
594 684
595static struct graphics_methods graphics_methods = 685static struct graphics_methods graphics_methods =
596{ graphics_destroy, draw_mode, draw_lines, draw_lines2, draw_lines3, draw_lines4, draw_lines_dashed, draw_polygon, draw_polygon2, draw_rectangle, draw_circle, draw_text, draw_image, draw_bigmap, send_osd_values, draw_image_warp, draw_restore, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data, 686{ graphics_destroy, draw_mode, draw_lines, draw_lines2, draw_lines3, draw_lines4, draw_lines_dashed, draw_polygon, draw_polygon2, draw_rectangle, draw_circle, draw_text, draw_image, draw_bigmap, draw_image_warp, draw_restore, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data,
597 image_free, get_text_bbox, overlay_disable, overlay_resize, set_attr, }; 687 image_free, get_text_bbox, overlay_disable, overlay_resize, set_attr, };
598 688
689/*
599static void resize_callback(struct graphics_priv *gra, int w, int h) 690static void resize_callback(struct graphics_priv *gra, int w, int h)
600{ 691{
601 //DBG dbg(0,"EEnter\n"); 692 //DBG // dbg(0,"EEnter\n");
602 // //DBG dbg(0,"w=%d h=%d ok\n",w,h); 693 // //DBG // dbg(0,"w=%d h=%d ok\n",w,h);
603 callback_list_call_attr_2(gra->cbl, attr_resize, (void *) w, (void *) h); 694 // callback_list_call_attr_2(gra->cbl, attr_resize, (void *) w, (void *) h);
695 navit_resize(attr_resize, this_);
604} 696}
697*/
605 698
699/*
606static void motion_callback(struct graphics_priv *gra, int x, int y) 700static void motion_callback(struct graphics_priv *gra, int x, int y)
607{ 701{
608 //DBG dbg(0,"EEnter\n"); 702 //DBG // dbg(0,"EEnter\n");
609 703
610 struct point p; 704 struct point p;
611 p.x = x; 705 p.x = x;
612 p.y = y; 706 p.y = y;
613 callback_list_call_attr_1(gra->cbl, attr_motion, (void *) &p); 707 callback_list_call_attr_1(gra->cbl, attr_motion, (void *) &p);
614} 708}
709*/
615 710
711/*
616static void keypress_callback(struct graphics_priv *gra, char *s) 712static void keypress_callback(struct graphics_priv *gra, char *s)
617{ 713{
618 //DBG dbg(0,"EEnter\n"); 714 //DBG // dbg(0,"EEnter\n");
619 callback_list_call_attr_1(gra->cbl, attr_keypress, s); 715 callback_list_call_attr_1(gra->cbl, attr_keypress, s);
620} 716}
717*/
621 718
719/*
622static void button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y) 720static void button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y)
623{ 721{
624 //DBG dbg(0,"EEnter\n"); 722 //DBG // dbg(0,"EEnter\n");
625 723
626 struct point p; 724 struct point p;
627 p.x = x; 725 p.x = x;
628 p.y = y; 726 p.y = y;
629 // //DBG dbg(0,"XXXXXXXYYYYYYYYY\n"); 727 // //DBG // dbg(0,"XXXXXXXYYYYYYYYY\n");
630 callback_list_call_attr_3(gra->cbl, attr_button, (void *) pressed, (void *) button, (void *) &p); 728 callback_list_call_attr_3(gra->cbl, attr_button, (void *) pressed, (void *) button, (void *) &p);
631} 729}
730*/
632 731
633static int set_activity(jobject graphics) 732static int set_activity(jobject graphics)
634{ 733{
635 //DBG dbg(0,"EEnter\n"); 734 // dbg(0,"EEnter\n");
636 735 // ---- DISABLED -------
637 jclass ActivityClass;
638 jmethodID cid;
639
640 ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity);
641 // //DBG dbg(0,"at 5\n");
642 if (ActivityClass == NULL)
643 {
644 //DBG dbg(0, "no activity class found\n");
645 return 0;
646 }
647 // //DBG dbg(0,"at 6\n");
648 cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V");
649 if (cid == NULL)
650 {
651 //DBG dbg(0, "no setContentView method found\n");
652 return 0;
653 }
654 //DBG dbg(0,"at 7\n");
655 (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics);
656 //DBG dbg(0,"at 8\n");
657 return 1; 736 return 1;
658} 737}
659 738
660static int 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) 739static int graphics_android_init(const char* name, struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int alpha, int wraparound, int use_camera)
661{ 740{
662 struct callback *cb; 741 struct callback *cb;
663 jmethodID cid;
664 742
743 // overwrite JNIenv!!
744 JNIEnv *jnienv2;
745 jnienv2 = jni_getenv();
746
665 //DBG dbg(0, "at 2 jnienv=%p\n", jnienv); 747 // dbg(0, "at 2 jnienv2=%p\n", jnienv2);
748 int thread_id = gettid();
749 // dbg(0, "THREAD ID=%d\n", thread_id);
750
666 //DBG dbg(0,"a1\n"); 751 //DBG // dbg(0,"a1\n");
667 if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) 752 if (!find_class_global("android/graphics/Paint", &ret->PaintClass))
668 return 0; 753 return 0;
669 //DBG dbg(0,"a2\n"); 754 //DBG // dbg(0,"a2\n");
670 if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init)) 755 if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init))
671 return 0; 756 return 0;
672 //DBG dbg(0,"a3\n"); 757 //DBG // dbg(0,"a3\n");
673 if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB)) 758 if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB))
674 return 0; 759 return 0;
675 //DBG dbg(0,"a4\n"); 760 //DBG // dbg(0,"a4\n");
676 if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth)) 761 if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth))
677 return 0; 762 return 0;
678 763
679 //DBG dbg(0,"a4.1\n"); 764 //DBG // dbg(0,"a4.1\n");
680 if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass)) 765 if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass))
681 return 0; 766 return 0;
682 //DBG dbg(0,"a4.2\n"); 767 //DBG // dbg(0,"a4.2\n");
683 if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile)) 768 if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile))
684 return 0; 769 return 0;
685 //DBG dbg(0,"a4.3\n"); 770 //DBG // dbg(0,"a4.3\n");
686 if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource)) 771 if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource))
687 return 0; 772 return 0;
688 773
689 //DBG dbg(0,"a4.4\n"); 774 //DBG // dbg(0,"a4.4\n");
690 if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass)) 775 if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass))
691 return 0; 776 return 0;
692 //DBG dbg(0,"a4.5\n"); 777 //DBG // dbg(0,"a4.5\n");
693 if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight)) 778 if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight))
694 return 0; 779 return 0;
695 //DBG dbg(0,"a4.6\n"); 780 //DBG // dbg(0,"a4.6\n");
696 if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth)) 781 if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth))
697 return 0; 782 return 0;
698 //DBG dbg(0,"a4.7\n"); 783 //DBG // dbg(0,"a4.7\n");
699 if (!find_class_global("android/content/Context", &ret->ContextClass)) 784 if (!find_class_global("android/content/Context", &ret->ContextClass))
700 return 0; 785 return 0;
701 //DBG dbg(0,"a4.8\n"); 786 //DBG // dbg(0,"a4.8\n");
702 if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources)) 787 if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources))
703 return 0; 788 return 0;
704 //DBG dbg(0,"a5\n"); 789 //DBG // dbg(0,"a5\n");
705 ret->Resources = (*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources); 790 ret->Resources = (*jnienv2)->CallObjectMethod(jnienv2, android_activity, ret->Context_getResources);
706 //DBG dbg(0,"a6\n"); 791 //DBG // dbg(0,"a6\n");
707 if (ret->Resources) 792 if (ret->Resources)
708 { 793 {
709 ret->Resources = (*jnienv)->NewGlobalRef(jnienv, ret->Resources); 794 ret->Resources = (*jnienv2)->NewGlobalRef(jnienv2, ret->Resources);
710 } 795 }
711 //DBG dbg(0,"a7\n"); 796 //DBG // dbg(0,"a7\n");
712 if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass)) 797 if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass))
713 return 0; 798 return 0;
714 //DBG dbg(0,"a8\n"); 799 //DBG // dbg(0,"a8\n");
715 if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier)) 800 if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier))
716 return 0; 801 return 0;
717 //DBG dbg(0,"a9\n"); 802 //DBG // dbg(0,"a9\n");
718 if (!find_class_global("com/zoffcc/applications/zanavi/NavitGraphics", &ret->NavitGraphicsClass)) 803 if (!find_class_global("com/zoffcc/applications/zanavi/NavitGraphics", &ret->NavitGraphicsClass))
719 return 0; 804 return 0;
720 //DBG dbg(0, "at 3\n"); 805 //DBG // dbg(0, "at 3\n");
721 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", "(Landroid/app/Activity;Lcom/zoffcc/applications/zanavi/NavitGraphics;IIIIIII)V"); 806
722 if (cid == NULL) 807
723 { 808 // --------------- Init the new Graphics Object here -----------------
724 //DBG dbg(0, "no method found\n"); 809 // --------------- Init the new Graphics Object here -----------------
725 return 0; /* exception thrown */ 810 // --------------- Init the new Graphics Object here -----------------
726 } 811 // dbg(0,"Init the new Graphics Object here: %s\n", name);
812
727 //DBG dbg(0, "at 4 android_activity=%p\n", android_activity); 813 //DBG // dbg(0, "at 4 android_activity=%p\n", android_activity);
814
815
816
817
818 if (NavitClass2 == NULL)
819 {
820 if (!android_find_class_global("com/zoffcc/applications/zanavi/Navit", &NavitClass2))
821 {
822 NavitClass2 = NULL;
823 return 0;
824 }
825 }
826
827 if (!find_static_method(NavitClass2, "get_graphics_object_by_name", "(Ljava/lang/String;)Lcom/zoffcc/applications/zanavi/NavitGraphics;", &Navit_get_graphics_object_by_name))
828 return 0;
829
830
728 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); 831 /// --old-- ret->NavitGraphics = (*jnienv2)->NewObject(jnienv2, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x : 0, pnt ? pnt->y : 0, w, h, alpha, wraparound, use_camera);
832
833 /// --new--
834 jstring string = (*jnienv2)->NewStringUTF(jnienv2, name);
835 ret->NavitGraphics = (*jnienv2)->CallStaticObjectMethod(jnienv2, NavitClass2, Navit_get_graphics_object_by_name, string);
836 (*jnienv2)->DeleteLocalRef(jnienv2, string);
837 /// --new--
838
839
729 //DBG dbg(0, "result=%p\n", ret->NavitGraphics); 840 // dbg(0, "result=%p\n", ret->NavitGraphics);
730 if (ret->NavitGraphics) 841 if (ret->NavitGraphics)
731 { 842 {
732 ret->NavitGraphics = (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics); 843 ret->NavitGraphics = (*jnienv2)->NewGlobalRef(jnienv2, ret->NavitGraphics);
733 } 844 }
845
846 // --------------- Init the new Graphics Object here -----------------
847 // --------------- Init the new Graphics Object here -----------------
848 // --------------- Init the new Graphics Object here -----------------
849
850
851
852
853
734 854
735 /* Create a single global Paint, otherwise android will quickly run out 855 /* Create a single global Paint, otherwise android will quickly run out
736 * of global refs.*/ 856 * of global refs.*/
737 /* 0x101 = text kerning (default), antialiasing */ 857 /* 0x101 = text kerning (default), antialiasing */
738 ret->Paint = (*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101); 858 ret->Paint = (*jnienv2)->NewObject(jnienv2, ret->PaintClass, ret->Paint_init, 0x101);
739 859
740 //DBG dbg(0, "l result=%p\n", ret->Paint); 860 //DBG // dbg(0, "l result=%p\n", ret->Paint);
741 if (ret->Paint) 861 if (ret->Paint)
742 { 862 {
743 ret->Paint = (*jnienv)->NewGlobalRef(jnienv, ret->Paint); 863 ret->Paint = (*jnienv2)->NewGlobalRef(jnienv2, ret->Paint);
744 } 864 }
745 //DBG dbg(0, "g result=%p\n", ret->Paint); 865 //DBG // dbg(0, "g result=%p\n", ret->Paint);
746 866
747 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V");
748 if (cid == NULL)
749 {
750 //DBG dbg(0, "no SetResizeCallback method found\n");
751 return 0; /* exception thrown */
752 }
753 cb = callback_new_1(callback_cast(resize_callback), ret);
754 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int) cb);
755
756 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V");
757 if (cid == NULL)
758 {
759 //DBG dbg(0, "no SetButtonCallback method found\n");
760 return 0; /* exception thrown */
761 }
762 cb = callback_new_1(callback_cast(button_callback), ret);
763 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int) cb);
764
765 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V");
766 if (cid == NULL)
767 {
768 //DBG dbg(0, "no SetMotionCallback method found\n");
769 return 0; /* exception thrown */
770 }
771 cb = callback_new_1(callback_cast(motion_callback), ret);
772 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int) cb);
773 867
774 // public Bitmap rotate_and_scale_bitmap(Bitmap in, int w, int h, int angle) 868 // public Bitmap rotate_and_scale_bitmap(Bitmap in, int w, int h, int angle)
775 869
776 if (!find_static_method(ret->NavitGraphicsClass, "rotate_and_scale_bitmap", "(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;", &ret->NavitGraphicsClass_rotate_and_scale_bitmap)) 870 if (!find_static_method(ret->NavitGraphicsClass, "rotate_and_scale_bitmap", "(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;", &ret->NavitGraphicsClass_rotate_and_scale_bitmap))
777 return 0; 871 return 0;
778
779 //
780 //cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "rotate_and_scale_bitmap", "(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;");
781 //if (cid == NULL) {
782 // //DBG dbg(0,"no rotate_and_scale_bitmap method found\n");
783 // return 0; /* exception thrown */
784 //}
785
786 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V");
787 if (cid == NULL)
788 {
789 //DBG dbg(0, "no SetKeypressCallback method found\n");
790 return 0; /* exception thrown */
791 }
792 cb = callback_new_1(callback_cast(keypress_callback), ret);
793 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int) cb);
794
795 if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline)) 872 if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline))
796 return 0; 873 return 0;
797 if (!find_method(ret->NavitGraphicsClass, "draw_polyline2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline2)) 874 if (!find_method(ret->NavitGraphicsClass, "draw_polyline2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline2))
798 return 0; 875 return 0;
799 if (!find_method(ret->NavitGraphicsClass, "draw_polyline3", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline3)) 876 if (!find_method(ret->NavitGraphicsClass, "draw_polyline3", "([IIIIIIII)V", &ret->NavitGraphics_draw_polyline3))
800 return 0; 877 return 0;
801 if (!find_method(ret->NavitGraphicsClass, "draw_polyline4", "(Landroid/graphics/Paint;[IIII)V", &ret->NavitGraphics_draw_polyline4)) 878 if (!find_method(ret->NavitGraphicsClass, "draw_polyline4", "([IIIIIIIII)V", &ret->NavitGraphics_draw_polyline4))
802 return 0; 879 return 0;
803 if (!find_method(ret->NavitGraphicsClass, "draw_polyline_dashed", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline_dashed)) 880 if (!find_method(ret->NavitGraphicsClass, "draw_polyline_dashed", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline_dashed))
804 return 0; 881 return 0;
805 if (!find_method(ret->NavitGraphicsClass, "set_dashes", "(Landroid/graphics/Paint;II)V", &ret->NavitGraphics_set_dashes)) 882 if (!find_method(ret->NavitGraphicsClass, "set_dashes", "(Landroid/graphics/Paint;II)V", &ret->NavitGraphics_set_dashes))
806 return 0; 883 return 0;
816 return 0; 893 return 0;
817 if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image)) 894 if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image))
818 return 0; 895 return 0;
819 if (!find_method(ret->NavitGraphicsClass, "draw_bigmap", "(IIFFIIIIIII)V", &ret->NavitGraphics_draw_bigmap)) 896 if (!find_method(ret->NavitGraphicsClass, "draw_bigmap", "(IIFFIIIIIII)V", &ret->NavitGraphics_draw_bigmap))
820 return 0; 897 return 0;
821 if (!find_method(ret->NavitGraphicsClass, "send_osd_values", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIFFF)V", &ret->NavitGraphics_send_osd_values)) 898
822 return 0;
823 if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode)) 899 if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode))
824 return 0; 900 return 0;
825 if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag)) 901 if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag))
826 return 0; 902 return 0;
827 if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable)) 903 //if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable))
828 return 0; 904 // return 0;
829 if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize)) 905 //if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize))
830 return 0; 906 // return 0;
907 /*
831 if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera)) 908 if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera))
832 return 0; 909 return 0;
910 */
833 911
834 //DBG dbg(0,"99\n"); 912 //DBG // dbg(0,"99\n");
835#if 0 913#if 0
836 set_activity(ret->NavitGraphics); 914 set_activity(ret->NavitGraphics);
837#endif 915#endif
838 return 1; 916 return 1;
839} 917}
846static jclass NavitClass; 924static jclass NavitClass;
847static jmethodID Navit_disableSuspend, Navit_exit; 925static jmethodID Navit_disableSuspend, Navit_exit;
848 926
849static void graphics_android_disable_suspend(struct window *win) 927static void graphics_android_disable_suspend(struct window *win)
850{ 928{
851 //DBG dbg(0,"enter\n"); 929 //DBG // dbg(0,"enter\n");
930 JNIEnv *jnienv2;
931 jnienv2 = jni_getenv();
932
852 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); 933 (*jnienv2)->CallVoidMethod(jnienv2, android_activity, Navit_disableSuspend);
853} 934}
854 935
855static struct graphics_priv * 936static struct graphics_priv *
856graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) 937graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)
857{ 938{
858 //DBG dbg(0,"EEnter\n"); 939 // dbg(0,"EEnter\n");
940
941 int thread_id = gettid();
942 // dbg(0, "THREAD ID=%d\n", thread_id);
859 943
860 struct graphics_priv *ret; 944 struct graphics_priv *ret;
861 struct attr *attr; 945 struct attr *attr;
862 int use_camera = 0; 946 int use_camera = 0;
947
948 // dbg(0,"event system - start\n");
863 if (!event_request_system("android", "graphics_android")) 949 if (!event_request_system("android", "graphics_android"))
950 {
951 return NULL;
952 }
953 // dbg(0,"event system - end\n");
954
864 return NULL;ret=g_new0(struct graphics_priv, 1); 955 ret=g_new0(struct graphics_priv, 1);
865
866 ret->cbl = cbl; 956 ret->cbl = cbl;
867 *meth = graphics_methods; 957 *meth = graphics_methods;
868 ret->win.priv = ret; 958 ret->win.priv = ret;
869 ret->win.fullscreen = graphics_android_fullscreen; 959 ret->win.fullscreen = graphics_android_fullscreen;
870 ret->win.disable_suspend = graphics_android_disable_suspend; 960 ret->win.disable_suspend = graphics_android_disable_suspend;
871 if ((attr = attr_search(attrs, NULL, attr_use_camera))) 961 if ((attr = attr_search(attrs, NULL, attr_use_camera)))
872 { 962 {
873 use_camera = attr->u.num; 963 use_camera = attr->u.num;
874 } 964 }
875 image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); 965 image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal);
966
967
968 // --------------- try to get a new Graphics Object -----------------
969 // --------------- try to get a new Graphics Object -----------------
970 // --------------- try to get a new Graphics Object -----------------
971 // dbg(0,"try to get a new Graphics Object\n");
876 if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, 0, use_camera)) 972 if (graphics_android_init("type:map-main", ret, NULL, NULL, 0, 0, 0, 0, use_camera))
877 { 973 {
878 ////DBG dbg(0,"returning %p\n",ret); 974 ////DBG // dbg(0,"returning %p\n",ret);
879 return ret; 975 return ret;
880 } 976 }
881 else 977 else
882 { 978 {
883 g_free(ret); 979 g_free(ret);
884 return NULL; 980 return NULL;
885 } 981 }
886} 982}
887 983
888static struct graphics_priv * 984static struct graphics_priv *
889overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) 985overlay_new(const char* name, struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound)
890{ 986{
891 //DBG dbg(0,"EEnter\n"); 987 // dbg(0,"EEnter\n");
988
989 int thread_id = gettid();
990 // dbg(0, "THREAD ID=%d\n", thread_id);
892 991
893 struct graphics_priv *ret=g_new0(struct graphics_priv, 1); 992 struct graphics_priv *ret=g_new0(struct graphics_priv, 1);
894 *meth = graphics_methods; 993 *meth = graphics_methods;
994
995 // --------------- try to get a new Graphics Object -----------------
996 // --------------- try to get a new Graphics Object -----------------
997 // --------------- try to get a new Graphics Object -----------------
998 // dbg(0,"try to get a new Graphics Object: %s\n", name);
895 if (graphics_android_init(ret, gr, p, w, h, alpha, wraparound, 0)) 999 if (graphics_android_init(name ,ret, gr, p, w, h, alpha, wraparound, 0))
896 { 1000 {
897 //DBG dbg(0, "returning %p\n", ret); 1001 // dbg(0, "returning %p\n", ret);
898 return ret; 1002 return ret;
899 } 1003 }
900 else 1004 else
901 { 1005 {
902 g_free(ret); 1006 g_free(ret);
904 } 1008 }
905} 1009}
906 1010
907static void event_android_main_loop_run(void) 1011static void event_android_main_loop_run(void)
908{ 1012{
909 //DBG dbg(0, "enter\n"); 1013 // dbg(0, "enter\n");
910} 1014}
911 1015
912static void event_android_main_loop_quit(void) 1016static void event_android_main_loop_quit(void)
913{ 1017{
914 //DBG dbg(0, "enter\n"); 1018 // dbg(0, "enter\n");
1019
1020 // overwrite JNIenv!!
1021 JNIEnv *jnienv2;
1022 jnienv2 = jni_getenv();
1023
1024 int thread_id = gettid();
1025 // dbg(0, "THREAD ID=%d\n", thread_id);
1026
915 // ******* exit(0); 1027 // ******* exit(0);
916 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit); 1028 (*jnienv2)->CallVoidMethod(jnienv2, android_activity, Navit_exit);
917} 1029}
918 1030
919static jclass NavitTimeoutClass; 1031static jclass NavitTimeoutClass;
920static jmethodID NavitTimeout_init; 1032static jmethodID NavitTimeout_init;
921static jmethodID NavitTimeout_remove; 1033static jmethodID NavitTimeout_remove;
929static jmethodID NavitWatch_remove; 1041static jmethodID NavitWatch_remove;
930 1042
931static struct event_watch * 1043static struct event_watch *
932event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) 1044event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb)
933{ 1045{
934 //DBG dbg(0,"enter\n"); 1046 // dbg(0,"enter\n");
935 jobject ret; 1047 jobject ret;
936 ret = (*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int) h, (int) cond, (int) cb); 1048 ret = (*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int) h, (int) cond, (int) cb);
937 // //DBG dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret); 1049 // //DBG // dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret);
938 if (ret) 1050 if (ret)
939 { 1051 {
940 //DBG dbg(0,"result for %p,%p\n",h,ret); 1052 //DBG // dbg(0,"result for %p,%p\n",h,ret);
941 ret = (*jnienv)->NewGlobalRef(jnienv, ret); 1053 ret = (*jnienv)->NewGlobalRef(jnienv, ret);
942 //DBG dbg(0,"g ret %p\n",ret); 1054 //DBG // dbg(0,"g ret %p\n",ret);
943 } 1055 }
944 return (struct event_watch *) ret; 1056 return (struct event_watch *) ret;
945} 1057}
946 1058
947static void event_android_remove_watch(struct event_watch *ev) 1059static void event_android_remove_watch(struct event_watch *ev)
948{ 1060{
949 //DBG dbg(0,"enter\n"); 1061 // dbg(0,"enter\n");
950 if (ev) 1062 if (ev)
951 { 1063 {
952 //DBG dbg(0,"enter %p\n",ev); 1064 //DBG // dbg(0,"enter %p\n",ev);
953 jobject obj = (jobject) ev; 1065 jobject obj = (jobject) ev;
954 // maybe need this ? ICS obj = (*jnienv)->NewGlobalRef(jnienv, obj); 1066 // maybe need this ? ICS obj = (*jnienv)->NewGlobalRef(jnienv, obj);
955 (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove); 1067 (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove);
956 // ICS (*jnienv)->DeleteGlobalRef(jnienv, obj); 1068 // ICS (*jnienv)->DeleteGlobalRef(jnienv, obj);
957 } 1069 }
958} 1070}
959 1071
960static struct event_timeout * 1072static struct event_timeout *
961event_android_add_timeout(int timeout, int multi, struct callback *cb) 1073event_android_add_timeout(int timeout, int multi, struct callback *cb)
962{ 1074{
963 //DBG dbg(0,"EEnter\n"); 1075 // dbg(0,"EEnter\n");
1076
1077 // overwrite JNIenv!!
1078 JNIEnv *jnienv2;
1079 jnienv2 = jni_getenv();
1080
1081 int thread_id = gettid();
1082 // dbg(0, "THREAD ID=%d\n", thread_id);
1083
1084 // timeout -> delay in milliseconds
964 1085
965 jobject ret; 1086 jobject ret;
1087 jobject ret_g = NULL;
966 ret = (*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int) cb); 1088 ret = (*jnienv2)->NewObject(jnienv2, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int) cb);
967 ////DBG dbg(0, "result for %d,%d,%p\n", timeout, multi, cb); 1089 //// dbg(0, "result for %d,%d,%p\n", timeout, multi, cb);
968 1090
969 if (ret) 1091 if (ret)
970 { 1092 {
971 //DBG dbg(0,"l ret=%p\n",ret); 1093 //// dbg(0,"l ret=%p\n",ret);
972 ret = (*jnienv)->NewGlobalRef(jnienv, ret); 1094 ret_g = (*jnienv2)->NewGlobalRef(jnienv2, ret);
973 //DBG dbg(0,"g ret=%p\n",ret); 1095 // dbg(0,"g ret=%p\n",ret_g);
974 } 1096 }
975 //DBG dbg(0,"leave\n"); 1097 //// dbg(0,"leave\n");
976 return (struct event_timeout *) ret; 1098 return (struct event_timeout *) ret_g;
977} 1099}
978 1100
979static void event_android_remove_timeout(struct event_timeout *to) 1101static void event_android_remove_timeout(struct event_timeout *to)
980{ 1102{
981 //DBG dbg(0,"EEnter\n"); 1103 // dbg(0,"EEnter\n");
1104
1105 // overwrite JNIenv!!
1106 JNIEnv *jnienv2;
1107 jnienv2 = jni_getenv();
1108
1109 // int thread_id = gettid();
1110 // dbg(0, "THREAD ID=%d\n", thread_id);
1111
982 1112
983 if (to) 1113 if (to)
984 { 1114 {
985 // //DBG dbg(0, "remove %p\n", to); 1115 // dbg(0, "remove %p\n", to);
986 //DBG dbg(0, "remove\n");
987 jobject obj = (jobject) to; 1116 jobject obj = (jobject) to;
988 (*jnienv)->CallVoidMethod(jnienv, obj, NavitTimeout_remove); 1117 (*jnienv2)->CallVoidMethod(jnienv2, obj, NavitTimeout_remove);
1118 // ICS
1119 //// dbg(0, "remove 1\n");
989 // ICS (*jnienv)->DeleteGlobalRef(jnienv, obj); 1120 (*jnienv2)->DeleteGlobalRef(jnienv2, obj);
1121 //// dbg(0, "remove 2\n");
990 } 1122 }
991} 1123}
992 1124
993static struct event_idle * 1125static struct event_idle *
994event_android_add_idle(int priority, struct callback *cb) 1126event_android_add_idle(int priority, struct callback *cb)
995{ 1127{
1128 // ----------------------------------------------------
1129 // ----------------------------------------------------
1130 // "priority" param is now misused here as "multi"
1131 // priority == 1000 -> set multi = 0
1132 // ----------------------------------------------------
1133 // ----------------------------------------------------
1134
996 //DBG dbg(0,"EEnter\n"); 1135 //// dbg(0,"EEnter\n");
997 1136
998#if 0 1137#if 0
999 jobject ret; 1138 jobject ret;
1000 // dbg(1,"enter\n"); 1139 // dbg(1,"enter\n");
1001 ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb); 1140 ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb);
1002 // dbg(1,"result for %p=%p\n",cb,ret); 1141 // dbg(1,"result for %p=%p\n",cb,ret);
1003 if (ret) 1142 if (ret)
1004 (*jnienv)->NewGlobalRef(jnienv, ret); 1143 (*jnienv)->NewGlobalRef(jnienv, ret);
1005 return (struct event_idle *)ret; 1144 return (struct event_idle *)ret;
1006#endif 1145#endif
1146 // ----- xxxxxxxx ------
1147 if (priority == 1000)
1148 {
1149 //dbg(0,"event add idle timeout=10 multi=0\n", priority);
1007 return (struct event_idle *) event_android_add_timeout(1, 1, cb); 1150 return (struct event_idle *) event_android_add_timeout(10, 0, cb);
1151 }
1152 else
1153 {
1154 //dbg(0,"event add idle timeout=%d multi=1\n", priority);
1155 return (struct event_idle *) event_android_add_timeout(priority, 1, cb);
1156 }
1008} 1157}
1009 1158
1010static void event_android_remove_idle(struct event_idle *ev) 1159static void event_android_remove_idle(struct event_idle *ev)
1011{ 1160{
1012 //DBG dbg(0,"EEnter\n"); 1161 //// dbg(0,"EEnter\n");
1013 1162
1014#if 0 1163#if 0
1015 // dbg(1,"enter %p\n",ev); 1164 // dbg(1,"enter %p\n",ev);
1016 if (ev) 1165 if (ev)
1017 { 1166 {
1023 event_android_remove_timeout((struct event_timeout *) ev); 1172 event_android_remove_timeout((struct event_timeout *) ev);
1024} 1173}
1025 1174
1026static void event_android_call_callback(struct callback_list *cb) 1175static void event_android_call_callback(struct callback_list *cb)
1027{ 1176{
1028 //DBG dbg(0,"enter\n"); 1177 //DBG // dbg(0,"enter\n");
1029} 1178}
1030 1179
1031static struct event_methods event_android_methods = 1180static struct event_methods event_android_methods =
1032{ event_android_main_loop_run, event_android_main_loop_quit, event_android_add_watch, event_android_remove_watch, event_android_add_timeout, event_android_remove_timeout, event_android_add_idle, event_android_remove_idle, event_android_call_callback, }; 1181{ event_android_main_loop_run, event_android_main_loop_quit, event_android_add_watch, event_android_remove_watch, event_android_add_timeout, event_android_remove_timeout, event_android_add_idle, event_android_remove_idle, event_android_call_callback, };
1033 1182
1034static struct event_priv * 1183static struct event_priv *
1035event_android_new(struct event_methods *meth) 1184event_android_new(struct event_methods *meth)
1036{ 1185{
1186
1187 // overwrite JNIenv!!
1188 JNIEnv *jnienv2;
1189 jnienv2 = jni_getenv();
1190
1191 // int thread_id = gettid();
1192 // dbg(0, "THREAD ID=%d\n", thread_id);
1193
1194
1037 //DBG dbg(0,"enter\n"); 1195 // dbg(0,"enter\n");
1038 if (!find_class_global("com/zoffcc/applications/zanavi/NavitTimeout", &NavitTimeoutClass)) 1196 if (!find_class_global("com/zoffcc/applications/zanavi/NavitTimeout", &NavitTimeoutClass))
1039 return NULL; 1197 return NULL;
1198
1199 // dbg(0,"ev 001\n");
1040 NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "<init>", "(IZI)V"); 1200 NavitTimeout_init = (*jnienv2)->GetMethodID(jnienv2, NavitTimeoutClass, "<init>", "(IZI)V");
1041 if (NavitTimeout_init == NULL) 1201 if (NavitTimeout_init == NULL)
1042 return NULL; 1202 return NULL;
1203 // dbg(0,"ev 002\n");
1043 NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V"); 1204 NavitTimeout_remove = (*jnienv2)->GetMethodID(jnienv2, NavitTimeoutClass, "remove", "()V");
1044 if (NavitTimeout_remove == NULL) 1205 if (NavitTimeout_remove == NULL)
1045 return NULL; 1206 return NULL;
1046#if 0 1207#if 0
1047 if (!find_class_global("com/zoffcc/applications/zanavi/NavitIdle", &NavitIdleClass)) 1208 if (!find_class_global("com/zoffcc/applications/zanavi/NavitIdle", &NavitIdleClass))
1048 return NULL; 1209 return NULL;
1049 NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "<init>", "(I)V"); 1210 NavitIdle_init = (*jnienv2)->GetMethodID(jnienv2, NavitIdleClass, "<init>", "(I)V");
1050 if (NavitIdle_init == NULL) 1211 if (NavitIdle_init == NULL)
1051 return NULL; 1212 return NULL;
1052 NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V"); 1213 NavitIdle_remove = (*jnienv2)->GetMethodID(jnienv2, NavitIdleClass, "remove", "()V");
1053 if (NavitIdle_remove == NULL) 1214 if (NavitIdle_remove == NULL)
1054 return NULL; 1215 return NULL;
1055#endif 1216#endif
1056 1217
1218 // dbg(0,"ev 003\n");
1057 if (!find_class_global("com/zoffcc/applications/zanavi/NavitWatch", &NavitWatchClass)) 1219 if (!find_class_global("com/zoffcc/applications/zanavi/NavitWatch", &NavitWatchClass))
1058 return NULL; 1220 return NULL;
1221 // dbg(0,"ev 004\n");
1059 NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(III)V"); 1222 NavitWatch_init = (*jnienv2)->GetMethodID(jnienv2, NavitWatchClass, "<init>", "(III)V");
1060 if (NavitWatch_init == NULL) 1223 if (NavitWatch_init == NULL)
1061 return NULL; 1224 return NULL;
1225 // dbg(0,"ev 005\n");
1062 NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); 1226 NavitWatch_remove = (*jnienv2)->GetMethodID(jnienv2, NavitWatchClass, "remove", "()V");
1063 if (NavitWatch_remove == NULL) 1227 if (NavitWatch_remove == NULL)
1064 return NULL; 1228 return NULL;
1065 1229
1230 // dbg(0,"ev 006\n");
1066 if (!find_class_global("com/zoffcc/applications/zanavi/Navit", &NavitClass)) 1231 if (!find_class_global("com/zoffcc/applications/zanavi/Navit", &NavitClass))
1067 return NULL; 1232 return NULL;
1233 // dbg(0,"ev 007\n");
1068 Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V"); 1234 Navit_disableSuspend = (*jnienv2)->GetMethodID(jnienv2, NavitClass, "disableSuspend", "()V");
1069 if (Navit_disableSuspend == NULL) 1235 if (Navit_disableSuspend == NULL)
1070 return NULL; 1236 return NULL;
1237 // dbg(0,"ev 008\n");
1071 Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V"); 1238 Navit_exit = (*jnienv2)->GetMethodID(jnienv2, NavitClass, "exit2", "()V");
1072 if (Navit_exit == NULL) 1239 if (Navit_exit == NULL)
1073 return NULL; 1240 return NULL;
1241
1074 //DBG dbg(0,"ok\n"); 1242 // dbg(0,"ok\n");
1243
1075 *meth = event_android_methods; 1244 *meth = event_android_methods;
1076 return NULL; 1245 return NULL;
1077} 1246}
1078 1247
1079void plugin_init(void) 1248void plugin_init(void)
1080{ 1249{
1081 //DBG dbg(0,"enter\n"); 1250 dbg(0,"enter\n");
1082 plugin_register_graphics_type("android", graphics_android_new); 1251 plugin_register_graphics_type("android", graphics_android_new);
1083 plugin_register_event_type("android", event_android_new); 1252 plugin_register_event_type("android", event_android_new);
1084} 1253}
1085 1254

Legend:
Removed from v.27  
changed lines
  Added in v.31

   
Visit the ZANavi Wiki