Article View: es.comp.lenguajes.java
Article #29072Programa para cargar una clase desde C
From: Juan Pedro Barbancho Manchon
Date: Mon, 02 Feb 1998 00:00
Date: Mon, 02 Feb 1998 00:00
162 lines
4612 bytes
4612 bytes
Hola,
Ejemplo para cargar una clase desde C, llamar al metodo estatico, y
cargar otra clase a partir del constructor y luego llamar a un metodo.
Esto primero va en C.
#include <jni.h>
#include <stdlib.h>
main()
{
JNIEnv *env;
JavaVM *jvm;
JDK1_1InitArgs vm_args;
jint res;
jclass cls;
jmethodID mid;
jstring jstr;
jobjectArray args;
/* */
jboolean logico=0;
jobject obj;
/* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and
beyond */
vm_args.version = 0x00010001;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
/* */
printf(" CLAssPAth %s\n", vm_args.classpath);
vm_args.classpath=getenv("classpath");
printf(" CLAssPAth %s\n", vm_args.classpath);
/* */
res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
/* Llama al metodo main de una clase */
cls = (*env)->FindClass(env, "Prog");
if (cls == 0) {
fprintf(stderr, "Can't find Prog class\n");
exit(1);
}
mid = (*env)->GetStaticMethodID(env, cls, "main",
"([Ljava/lang/String;)V");
if (mid == 0) {
fprintf(stderr, "Can't find Prog.main\n");
exit(1);
}
jstr = (*env)->NewStringUTF(env, " from C!");
if (jstr == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
args = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env,
"java/lang/String"), jstr);
if (args == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
(*env)->CallStaticVoidMethod(env, cls, mid, args);
/* Lo anterior llamaba a un metodo estatico de una clase*/
/* Intento para llamar a un metodo de una clase instanciada*/
/* Metodo boolean, mostrar */
cls = (*env)->FindClass(env, "Prueba");
if (cls == 0) {
fprintf(stderr, "Can't find Prueba class\n");
exit(1);
}
/* Lanzado el constructor */
fprintf(stderr, "find Prueba\n");
mid = (*env)->GetMethodID(env, cls, "<init>", "()V");
if (mid == 0) {
fprintf(stderr, "Can't crear una nueva instancia\n");
exit(1);
}
fprintf(stderr, "find Prueba from C\n");
/*
jstr = (*env)->NewStringUTF(env, " from C!");
if (jstr == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
} */
/*
args = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env,
"java/lang/String"), jstr);
if (args == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
*/
obj = (*env)->NewObject(env, cls, mid);
if (obj == 0){
fprintf(stderr, "Error lanzando prueba()\n");
exit(1);
}
/* Compruebo si es una instancia de la clase */
fprintf(stderr, "fin de la prueba de Carga()\n");
logico=(*env)->IsInstanceOf(env, obj, cls);
if (logico == 1) printf("Valor devuelto 1");
else printf("Valor devuelto 0");
/* Comprobado */
/* finalizado el constructor */
fprintf(stderr, "Llamare a pepe()\n");
mid = (*env)->GetMethodID(env, cls, "pepe", "()Z");
if (mid == 0) {
fprintf(stderr, "Can't find Prueba.pepe\n");
exit(1);
}
fprintf(stderr, "Pepe encontrado()\n");
fprintf(stderr, "Llamo a pepe()\n");
logico=(*env)->CallNonvirtualBooleanMethod(env, obj,cls, mid);
fprintf(stderr, "Llamado pepe()\n");
/* Devolviendo */
if (logico == 1) printf("Valor devuelto 1");
else printf("Valor devuelto 0");
/* Fin prueba */
(*jvm)->DestroyJavaVM(jvm);
}
Esto de aqui en Java
//////////////////////////PROG.JAVA////////////////////////////////
public class Prog {
Prog()
{
}
public static void main(String[] args) {
System.out.println("Hello World");
}
}
class Prueba{
Prueba()
{
System.out.println("Lanzando pruebas");
}
boolean pepe()
{
System.out.println("Pepe de los palotes");
return(true);
}
}
--
--------------------------------------------------
Juan Pedro Barbancho Manch๏ฟฝn
CTI UCO
http://www.uco.es/grupos/cti
ct2bamaj@uco.es
Java Senior Programmer
Search for a job
Technical Details
Message-ID:
<34D607B4.BED8E7AD@uco.es>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII X-Google-Thread: 1116f3,cf39b6ce30f7ccf8,start X-Google-Attributes: gid1116f3,public From: Juan Pedro Barbancho Manchon <ct2bamaj@uco.es> Subject: Programa para cargar una clase desde C Date: 1998/02/02 Message-ID: <34D607B4.BED8E7AD@uco.es> X-Deja-AN: 321461035 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Organization: CTI Newsgroups: es.comp.lenguajes.java