🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Callback en Java (2)

#17160
From: Juan Gonzalo de Silva Medina
Date: Fri, 01 Dec 2000 00:00
137 lines
5272 bytes
 > [...]

> [JAVA]
> public class jPruListen
> {
> 	public static void onFuncion(int N)
> 	{
> 		System.out.println("Parametro ofrecido : " + N);
> 	}
> }
> // --------------------------------------------------------------------------
> 
> [C++]
> __declspec(dllexport) int FuncPuente(int N)
> {
> 	//
> 	// A "FuncPuente" la llamamos desde una pulsaci�n de un Bot�n.
> 	// Al pulsar, "FuncPuente" entra en juego.
> 	//
> 	TRZDBG1("*** [DLL] INI FuncPuente().");
> 
> 	// ---------------------------------------------------------
> 	// Llamamos (Intentamos) al metodo jPruListen.onFuncion
> 	// ---------------------------------------------------------
> 	//
> 	JavaVM *jvm=NULL;
> 	JNIEnv *env=NULL;
> 	JDK1_1InitArgs vm_args;
> 	jint iRet=0;
> 
> 	vm_args.version = 0x00010001;
> 	iRet=JNI_GetDefaultJavaVMInitArgs(&vm_args); // Ok
> 	iRet=JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // Ok
> 	iRet=jvm->AttachCurrentThread((void**)&env, 0); // Ok
> 
> 	jclass cls = env->FindClass("jPruListen"); // Aqu� --> ERROR
> 	jmethodID mid = env->GetStaticMethodID(cls, "onFuncion", "(I)V");
> 	env->CallStaticVoidMethod(cls, mid, 5);
> 	jvm->DetachCurrentThread();
> 	jvm->DestroyJavaVM();    
> 
> 	return 0;
> }
> // --------------------------------------------------------------------------
> 


He tenido que perderme algo desde que hice mi programa nativo o esto no 
me cuadra nada...

Espera, espera, ya lo tengo, tsch! puede, no estoy seguro, pero, si no 
leo mal tu c�digo, est�s creando una nueva instancia de m�quina virtual 
de Java �no? �para qu� estas haciendo esto? �En windows es as�? es muy 
raro, te pongo lo que yo he hecho en OS/2...

Lo que yo tengo en Java:

private native int cargaMonederoEuro6000Peer(int, java.lang.String, 
java.lang.String, java.lang.String, java.lang.String, int);

En principio este m�todo es nativo y recibe varios par�metros, cuando ha 
hecho algunas cosas llama a un m�todo del objeto (el propio objeto) para 
que haga un proceso y luego le retorna denuevo la ejecuci�n...

El m�todo en java que se llama es:

private int realizarEnvioCargaCECA();

Este m�todo devuelve un entero despues de enviar los datos a un destino 
y deja el resultado (los datos devueltos por ese destino en una variable).


As�, en C++ tengo:


JNIEXPORT jint JNICALL Java_monedero_nativo_ATM_cargaMonederoEuro6000Peer
   (JNIEnv *e, jobject o, jint i, jstring ppsam, jstring pan, jstring 
ofi, jstring jsCodMoneda, jint importe ){ [...] }

La primera diferencia, como puedes ver es que a m� me genera dos 
par�metros m�s, uno el env. y otro el objeto actual que ha llamado a la DLL.

Dentro del c�digo, lo m�s relevante que hago es:

jclass clase = e->GetObjectClass(o);
jmethodID mid_RealizarEnvioCargaCECA = 
e->GetMethodID(clase,"realizarEnvioCargaCECA","()I");
int rc = e->CallIntMethod(o, mid_RealizarEnvioCargaCECA);

La �nica diferencia con tu c�digo, es que yo necesito llamar a un m�todo 
de instancia y no de clase (no est�tico). Pero la filosofia es la misma...

Definitivamente recuerdo que lo hice mirando el manual de programaci�n 
de JNI (esto era en 1.1.x) no lo he probado para la 1.3 aunque supongo 
que debe de funcionar, pero nunca se sabe, claro...

Voy a consultar un poco el tema...


Efectivamente tu lo que estas haciendo es cargar una nueva JVM, otra 
distinta a la que tienes en memoria (y que ha llamado a tu clase 
inicialmente)....

Ha cambiado algo, pero casi nada, pero ha sido interesante el repaso, 
este tema lo tenia algo perdido...

El esquema correcto que has de utilizar lo tienes en el propio tutorial 
sobre jni:

http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/index.html

Que est� muy claro...

De todas maneras lo que te he puesto ha de funcionar, as� y todo te hago 
un esquema:

1.- Crear una clase java Runneable.
2.- Crear un m�todo nativo que ser� el invocado.
3.- Crear un m�todo java (dentro de ese objeto) si quieres puede ser 
est�tico, claro.
4.- llamar al m�todo nativo desde el run.
5.- cuando en la parte nativa ocurra algo, llamar al objeto para que 
procese el evento.


Para el proceso de compilaci�n y de generaci�n te recomiendo que visites 
la p�gina dicha anteriormente...


Lamento haberme extendido tanto, si tienes alg�n problema dimelo...

Saludos,


--
Juan Gonzalo de Silva Medina
if(!Linux) throw new Exception(" :( ");
Technical Details
Message-ID: <3A2827E5.4050801@caymasa.es>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <902rmp$msd$1@nnrp1.deja.com> <3A26BF55.3010008@caymasa.es> <otue2tg89dg7hc87a0cggf4faqucqbhn3i@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/01
Message-ID: <3A2827E5.4050801@caymasa.es>
X-Deja-AN: 700097012
Content-Transfer-Encoding: 8bit
References: <902rmp$msd$1@nnrp1.deja.com> <3A26BF55.3010008@caymasa.es> <otue2tg89dg7hc87a0cggf4faqucqbhn3i@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