Article View: es.comp.lenguajes.java
Article #17160Re: Callback en Java (2)
From: Juan Gonzalo de Silva Medina
Date: Fri, 01 Dec 2000 00:00
Date: Fri, 01 Dec 2000 00:00
137 lines
5272 bytes
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-mailReferences:
<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