🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.lenguajes.java
Article #16990

Re: Callback en Java (2)

#16990
From: Alberto Fdez
Date: Tue, 12 Dec 2000 12:39
194 lines
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-mail
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>

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