Article View: es.comp.lenguajes.java
Article #16990Re: Callback en Java (2)
From: Alberto Fdez
Date: Tue, 12 Dec 2000 12:39
Date: Tue, 12 Dec 2000 12:39
194 lines
5836 bytes
5836 bytes
On Tue, 05 Dec 2000 22:02:39 +0100, Juan Gonzalo de Silva Medina
<gonzalo@caymasa.es> wrote:
Buenas, perdona la tardanza en el reply.
El tema est� solucionado, te cuento (os cuento) como lo he tratado.
>
>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....
Era una forma de plantear el problema, ;)
>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...
Por supuesto.
>
>> (... Cortado ...)
(.... mas cortado ....)
>
>Por supuesto que no funciona, eso viene en la documentaci�n, si pasas
>JNIEnv * entre hilos no sirve...
Tambien de acuerdo.
>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...
Aqu� no entiendo lo que me quieres dices. :(
...
(Aviso, que la soluci�n que he dado a mi problema es "la misma idea que me
propones, pero con matizes").
[Quitando texto imnecesario).
>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)
Cuidad�n, cuidad�n...
El problema (probado est�) est� en recojer este entorno (depender� desde
donde llames a esta native) para crear tu NewGlobalRef().
Aunque tu code no es valido, (creas una nueva instacia de la clase a la cual
pertenece el metodo nativo llamado) da la idea buena. El entorno es clave.
Como he resulto mi problema,
[JAVA](2 clases)
public class MiMain
{
public native InicializaCosas(voi);
public static void main (String[] args)
{
...... InicializaCosas();
While_true(). // Que se quede pegado.
}
.....
{
..... Carga DLL
}
}
public class MiClaseJAVA
{
//
// Para esta clase no existira ningun "new" en nuestro codigo java.
//
//
// Recuerdo que la idea es llamar a este metodo desde
// un DLL/Win32 "cuando quiera".
//
public void onFuncion(void);
}
[Code C++]
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved)
{
// Utilizo OnLOad para "quedarme" el VM en donde corre mi proceso.
// Una variable global, por ejemplo.
//
MIJavaVMGlobal=vm;
return JNI_VERSION_1_2;
}
JNIEXPORT void JNICALL
Java_InicializaCosas(JNIEnv *env, jobject jObj)
{
// Me guarbdo Obj y Class
//
// env, no le tomo del par�metro de entrada.
JNIEnv *env=NULL;
MIJavaVMGlobal->GetEnv((void **)&env, JNI_VERSION_1_2);
// Tengo el entorno
// Recuperadmos objeto.
// Obviamos control de errores.
//
jclass cls;
jobject jobj;
jmethodID mid;
cls = env->FindClass( "MiClaseJAVA" );
// Instaciamos "MiClaseJAVA"
mid=env->GetMethodID(cls, "<init>", "()V");
jobj=env->NewObject(cls, mid);
// DeleteGlobalRef(), en alg�n FinalizaCosas().
// El objetivo: Me guardo en globales (o donde quiera).
clsG=cls; // No es necesario, pero el FindClass consume mucho
// para luego trabajarlo en un manejador.
jobG=jobj;
......
}
// Imaginemos ahora que la DLL captura "los click" del rat�n, algo simple.
//
// El manejador del envento, prodr�a ser "OnClickraton()",
int OnClickRaton(void)
{
// Y desde aqu� quiero llamar a OnFuncion() (JAVA) para que la aplicaci�n
// Java se entere que se ha pulsado el rat�n. Estamos de acuerdo , no!
//
...
JNIEnv *env=NULL;
jmethodID mid;
MIJavaVMGlobal->GetEnv((void **)&env, JNI_VERSION_1_2);
mid=env->GetMethodID(clsG, "onFuncion", "()V");
env->CallVoidMethod(jobjG, mid);
...
}
Mira a ver que te parece, a mi me funciona y as� consiguo notificaciones de
una DLL que captura eventos MSWindows, y manejadas (con slo manejadores
correspondientes) en Java.
Un Saludo.
--
Alberto Fdez
<afernandeza$%&polar.es>
<afa07$%&tid.es> // Where "$%&" = '@', Of course ...
Technical Details
Message-ID:
<b37c3tcfmqsi0fo9i77leihgmcm4j6uuqg@4ax.com>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!supernews.com!news-x.support.nl!newsfeeds.belnet.be!naxos.belnet.be!news.belnet.be!news.rediris.es!alcala!news-2.rediris.es!tidos.tid.es!not-for-mailReferences:
<902rmp$msd$1@nnrp1.deja.com> <3A26BF55.3010008@caymasa.es> <otue2tg89dg7hc87a0cggf4faqucqbhn3i@4ax.com> <3A2827E5.4050801@caymasa.es> <sunm2tk344itj1k29ameub70fhunnucvj0@4ax.com> <3A2D57EF.9050300@caymasa.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: 1116f3,766135f76ea77199 X-Google-Attributes: gid1116f3,public X-Google-ArrivalTime: 2000-12-14 01:41:05 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!supernews.com!news-x.support.nl!newsfeeds.belnet.be!naxos.belnet.be!news.belnet.be!news.rediris.es!alcala!news-2.rediris.es!tidos.tid.es!not-for-mail From: Alberto Fdez <albertoFdez@ver.Firma.see.Signature> Newsgroups: es.comp.lenguajes.java Subject: Re: Callback en Java (2) Date: Tue, 12 Dec 2000 13:39:09 +0100 Organization: Telefonica I+D Lines: 194 Message-ID: <b37c3tcfmqsi0fo9i77leihgmcm4j6uuqg@4ax.com> References: <902rmp$msd$1@nnrp1.deja.com> <3A26BF55.3010008@caymasa.es> <otue2tg89dg7hc87a0cggf4faqucqbhn3i@4ax.com> <3A2827E5.4050801@caymasa.es> <sunm2tk344itj1k29ameub70fhunnucvj0@4ax.com> <3A2D57EF.9050300@caymasa.es> NNTP-Posting-Host: 1.100.2.224 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Newsreader: Forte Agent 1.8/32.548