๐Ÿš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Programa para cargar una clase desde C

#29072
From: Juan Pedro Barbancho Manchon
Date: Mon, 02 Feb 1998 00:00
162 lines
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-mail

Show 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