diff options
Diffstat (limited to 'navit')
-rw-r--r-- | navit/android.c | 24 | ||||
-rw-r--r-- | navit/android/src/org/navitproject/navit/NavitWatch.java | 8 | ||||
-rw-r--r-- | navit/graphics/android/graphics_android.c | 28 |
3 files changed, 35 insertions, 25 deletions
diff --git a/navit/android.c b/navit/android.c index eec4005a8..1107f600c 100644 --- a/navit/android.c +++ b/navit/android.c @@ -1,6 +1,5 @@ #include <stdlib.h> #include <string.h> -#include <poll.h> #include <glib.h> #include "android.h" #include <android/log.h> @@ -142,26 +141,11 @@ Java_org_navitproject_navit_NavitIdle_IdleCallback( JNIEnv* env, jobject thiz, i } JNIEXPORT void JNICALL -Java_org_navitproject_navit_NavitWatch_poll( JNIEnv* env, jobject thiz, int fd, int cond) +Java_org_navitproject_navit_NavitWatch_poll( JNIEnv* env, jobject thiz, int func, int fd, int cond) { - struct pollfd pfd; - pfd.fd=fd; - dbg(1,"%p poll called for %d %d\n",env, fd, cond); - switch ((enum event_watch_cond)cond) { - case event_watch_cond_read: - pfd.events=POLLIN; - break; - case event_watch_cond_write: - pfd.events=POLLOUT; - break; - case event_watch_cond_except: - pfd.events=POLLERR; - break; - default: - pfd.events=0; - } - pfd.revents=0; - poll(&pfd, 1, -1); + void (*pollfunc)(JNIEnv *env, int fd, int cond)=(void *)func; + + pollfunc(env, fd, cond); } JNIEXPORT void JNICALL diff --git a/navit/android/src/org/navitproject/navit/NavitWatch.java b/navit/android/src/org/navitproject/navit/NavitWatch.java index 33303c386..ebe5c8727 100644 --- a/navit/android/src/org/navitproject/navit/NavitWatch.java +++ b/navit/android/src/org/navitproject/navit/NavitWatch.java @@ -32,17 +32,19 @@ public class NavitWatch implements Runnable { } }; private boolean removed; + private int watch_func; private int watch_fd; private int watch_cond; private int watch_callbackid; private boolean callback_pending; private Runnable callback_runnable; - public native void poll(int fd, int cond); + public native void poll(int func, int fd, int cond); public native void WatchCallback(int id); - NavitWatch(int fd, int cond, int callbackid) + NavitWatch(int func, int fd, int cond, int callbackid) { // Log.e("NavitWatch","Creating new thread for "+fd+" "+cond+" from current thread " + java.lang.Thread.currentThread().getName()); + watch_func=func; watch_fd=fd; watch_cond=cond; watch_callbackid=callbackid; @@ -60,7 +62,7 @@ public class NavitWatch implements Runnable { { for (;;) { // Log.e("NavitWatch","Polling "+watch_fd+" "+watch_cond + " from " + java.lang.Thread.currentThread().getName()); - poll(watch_fd, watch_cond); + poll(watch_func, watch_fd, watch_cond); // Log.e("NavitWatch","poll returned"); if (removed) break; diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c index fad09c558..c15ac0328 100644 --- a/navit/graphics/android/graphics_android.c +++ b/navit/graphics/android/graphics_android.c @@ -19,6 +19,7 @@ #include <unistd.h> #include <glib.h> +#include <poll.h> #include "config.h" #include "window.h" #include "point.h" @@ -715,11 +716,34 @@ static jclass NavitWatchClass; static jmethodID NavitWatch_init; static jmethodID NavitWatch_remove; + +static void do_poll(JNIEnv *env, int fd, int cond) +{ + struct pollfd pfd; + pfd.fd=fd; + dbg(1,"%p poll called for %d %d\n", fd, cond); + switch ((enum event_watch_cond)cond) { + case event_watch_cond_read: + pfd.events=POLLIN; + break; + case event_watch_cond_write: + pfd.events=POLLOUT; + break; + case event_watch_cond_except: + pfd.events=POLLERR; + break; + default: + pfd.events=0; + } + pfd.revents=0; + poll(&pfd, 1, -1); +} + static struct event_watch * event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) { jobject ret; - ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int) h, (int) cond, (int)cb); + ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int)do_poll, (int) h, (int) cond, (int)cb); dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret); if (ret) (*jnienv)->NewGlobalRef(jnienv, ret); @@ -832,7 +856,7 @@ event_android_new(struct event_methods *meth) if (!find_class_global("org/navitproject/navit/NavitWatch", &NavitWatchClass)) return NULL; - NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(III)V"); + NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(IIII)V"); if (NavitWatch_init == NULL) return NULL; NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); |