Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Levantar JVM

Iniciado por 1cacalvo, 13 de Diciembre de 2007, 10:51:56 AM

« anterior - próximo »

1cacalvo

Tengo un problema levantando la JVM (java virtual machine), y es que cuando realizo una llamada a FindClass me devuelve una ref Nula :(

Estoy utilizando una version de JDK jre1.5.0_11...

Tengo un archivo panel.jar con su clase DemoPanel que solamente crea un panel de prueba...
El archivo panel.jar se encuentra en la ruta D:/aplic/s211/bin

Se os ocurre algo por lo que me pueda estar fallando???

hVM = ::LoadLibrary( jvmPath_ );
 if (hVM == NULL)
 {
   return;
 }

 vm_args_.version = 0x00010002;  
 JNI_GETDEFAULTJAVAVMINITARGS initArgsVM = (JNI_GETDEFAULTJAVAVMINITARGS)JNU_GetDefaultArgsVM();
 initArgsVM(&vm_args_);

 vm_args_.classpath = "d:/aplib/s211/bin";
 
 // carga dinamicacmente la libreria de java
 JNI_CREATEJAVAVM createVM=  (JNI_CREATEJAVAVM)JNU_FindCreateJavaVM();
 res_ = createVM(&jvm_, (void**)&env_, &vm_args_);
 if (res_ < 0)
 {
   RTS_TRACE0( jni_invoker_id , "Can't create Java VM");    
   return;
 }
   
 cls_ = env_->FindClass("DemoPanel");
 //Esta llamada devuelve nulo

 env_->GetStaticMethodID(cls_,"main","([Ljava/lang/String;)V");

Tei

Me voy a atrever a contestar aunque en mi vida he tocado nada relacionado siguiera lejanamente con lo que comentas. Ese texto.. ¿es codigo fuente?.

En este ejemplo:
http://gcc.gnu.org/ml/java/2003-03/msg00387.html

Me llama la atencion esta linea:
#define USER_CLASSPATH "." /* where Prog.class is */

Eso no aparece en tu snip de codigo. ¿Especificas el path de busqueda en otro sitio o algo?.

Si no es eso. Desde aqui solo puedo imaginar que el problema es como has empaquetado las clases (¿dentro de otro contenedor como paquete?), y que no se visualizan externamente. Prueba con una clasecilla sencilla, en lugar de con tu clase del mundo real. Pero este "desde aqui" es desde la mas profunda ignorancia, lol, :D, no se nadaL del tema.


update:
ahora que me fijo un poco mas, veo
vm_args_.classpath = "d:/aplib/s211/bin";
oops!. si que especificas classpath

update2:
como lo hace sun:
http://java.sun.com/docs/books/jni/html/invoke.html

#define USER_CLASSPATH "." /* where Prog.class is */
....
#ifdef JNI_VERSION_1_2
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
    options[0].optionString =
        "-Djava.class.path=" USER_CLASSPATH;
    vm_args.version = 0x00010002;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = JNI_TRUE;
    /* Create the Java VM */
    res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
#else
    JDK1_1InitArgs vm_args;
    char classpath[1024];
    vm_args.version = 0x00010001;
    JNI_GetDefaultJavaVMInitArgs(&vm_args);
    /* Append USER_CLASSPATH to the default system class path */
    sprintf(classpath, "%s%c%s",
            vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
    vm_args.classpath = classpath;


Pero esto es distinto a lo que tu haces.
vm_args_.classpath = "d:/aplib/s211/bin";
classpath tiene pinta que indica todos los paths de java, no solo el de tu clase. Quizas por eso tu clase no instancia... porque importa otra clase, y el path a esa otra clase no se encuentra.

¿estas cosas no generan un log en alguna parte?

Zaelsius

Creo que el código está bien, prueba a incluir el archivo .jar explícitamente dentro del classpath:


vm_args_.classpath = ".;d:/aplib/s211/bin/panel.jar";

1cacalvo

Very thanks por las respuestas!!!

El motivo de que no me funcionara es que el nombre de la clase no coincidia con el nombre del fichero .class

He probado con el .class a secas y ya me encuentra la función...

Ahora me he encontrado con otro problema, lanzo el metodo y se me crea un panel (que es lo que queria) pero mi aplicación no se queda bloqueada y sigue la ejecución, y lo que pretendo es lanzar dicho panel y que se me cree en forma modal, osea que una vez lanzado mi prog no siga el hilo de ejecución...

Asi que voy a investigar un poco, y si sabeis o teneis alguna idea, pues agradecido en escucharla!!!

     Un saludo cALvET






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.