Article View: es.comp.lenguajes.java
Article #17100Re: Callback en Java (2)
From: Juan Gonzalo de Silva Medina
Date: Tue, 05 Dec 2000 00:00
Date: Tue, 05 Dec 2000 00:00
108 lines
4228 bytes
4228 bytes
Alberto Fdez wrote:
> On Fri, 01 Dec 2000 23:36:21 +0100, Juan Gonzalo de Silva Medina
> <gonzalo@caymasa.es> wrote:
>
> (.....)
>
> Si, pero mi problema es que NO tengo en mi c�digo Java, ninguna llamada
> "native" (No la necesito, ni quiero).
>
> La notificaci�n C++ hacia Java a de ser espontanea, sin ninguna llamada previa
> (desde Java) a un metodo nativo (en C++)
Bueno es un poco estremista eso de que ni la necesitas ni la quieres....
En cuanto a lo de espontanea, no lo creo, yo diria que no sabes en el
tiempo cuando se produce,pero desde luego has de saber a quien has de
invocar...
> (... Cortado ...)
>
> Presuponiendo que me hago una "native", una que se llame "InicializaCosas()"
> (por ejemplo), para as� obtener el entorno del hilo en donde mi VM corra.
>
> private native int InicializaCosas(void){...}
> /* Y en C++, el H, tras pasar el javah.. que quede: */
> InicializaCosas
> JNIEXPORT jint JNICALL Java_InicializaCosas (JNIEnv *, jobject); // � Similar.
>
> El problema que detro de Java_InicializaCosas() Na llama a ningun metodo Java
> sino en un hilo distinto (y dios sabe cuando) en dodnde le tengo que llamar.
>
> Lo Obvio, parece que es guardar el JNIEnv *,... en alguna variable global (o
> similar) para posteriormente usarlo, pero no funciona.
Por supuesto que no funciona, eso viene en la documentaci�n, si pasas
JNIEnv * entre hilos no sirve...
Sigo opinando que estas un poco "cerrado en banda" :) sigues
considerando una parte del problema y no todo en su conjunto. Si no se
adapta Java a lo que tu quieres hacer, adaptat� a lo que hace Java, te
ser� mucho m�s sencillo :).
Vamos a ver, �Qu� problema tienes en que el m�todo C++ no sea un
thread?, es por gusto o por que tienes una DLL que vas ha llamar que a
su vez hace un thread...
Perdona, pero me parece que est�s liando el tema innecesariamente.
Y dejando esto de lado, creo que lo puedes hacer de la siguiente manera,
aunque no lo he probado:
En java llamas a un m�todo Java_InicializaCosas(JNIEnv*, jobject);
En dicho objeto java creas el m�todo al que vas a invocar cuando ocurra
lo que sea en el thread en C++.
En el programa nativo haces:
static jclass cls = 0;
static jfieldID fid;
JNIEXPORT void JNICALL
Java_InicializaCosas(JNIEnv *env, jobject obj)
{
if (cls == 0) {
jclass cls1 = (*env)->GetObjectClass(env, obj);
if (cls1 == 0) {
.../*Error*/
}
cls = (*env)->NewGlobalRef(env, cls1);
if (cls == 0) {
... /* error */
}
fid = (*env)->GetStaticFieldID(env, cls, "llamada", "I");
}
/*llamar al m�todo*/
}
Una vez en tu thread C++ has de llamar (con los mecanismos jni normales)
utilizando el objeto jclass.
Esto lo que realmente hace es crear un apuntador global al objeto en
Java, para que no se pierda (sea recuperado por el GC).
No se si te servir�, por lo menos es lo �nico que he conseguido
encontrar que se adapta a lo que tu quieres exactamente.
Pero OJO, has de llamar a DeleteGlobalRef para eliminarla, sino en Java
NUNCA se destruir� la instancia del objeto.
A mi esto me parece mucho m�s rebuscado y no es thread-safe...
Espero tu respuesta :)
Saludos,
--
Juan Gonzalo de Silva Medina
if(!Linux) throw new Exception(" :( ");
Technical Details
Message-ID:
<3A2D57EF.9050300@caymasa.es>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<902rmp$msd$1@nnrp1.deja.com> <3A26BF55.3010008@caymasa.es> <otue2tg89dg7hc87a0cggf4faqucqbhn3i@4ax.com> <3A2827E5.4050801@caymasa.es> <sunm2tk344itj1k29ameub70fhunnucvj0@4ax.com>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: 1116f3,766135f76ea77199 X-Google-Attributes: gid1116f3,public From: Juan Gonzalo de Silva Medina <gonzalo@caymasa.es> Subject: Re: Callback en Java (2) Date: 2000/12/05 Message-ID: <3A2D57EF.9050300@caymasa.es> X-Deja-AN: 701500207 Content-Transfer-Encoding: 8bit References: <902rmp$msd$1@nnrp1.deja.com> <3A26BF55.3010008@caymasa.es> <otue2tg89dg7hc87a0cggf4faqucqbhn3i@4ax.com> <3A2827E5.4050801@caymasa.es> <sunm2tk344itj1k29ameub70fhunnucvj0@4ax.com> X-Accept-Language: es, en Content-Type: text/plain; charset=ISO-8859-1; format=flowed Organization: Telefonica Transmision de Datos Mime-Version: 1.0 User-Agent: Mozilla/5.0 (X11; U; Linux 2.2.14-5.0 i686; en-US; m18) Gecko/20001107 Netscape6/6.0 Newsgroups: es.comp.lenguajes.java