2010-01-08 20 views
5

Gracias por echar un vistazo a la pregunta. Estoy tratando de invocar un método java que está en archivos de clase usando la interfaz JNI. A su vez, el archivo de clase llamado debería estar ejecutando el otro archivo .jar que reside en el mismo directorio? Tuve dificultades para lograr esto y no tuve éxito en la ejecución del archivo .jar. Quiero decir que no puedo obtener los resultados de la clase fuile disponible en el archivo .jar.¿Puede la aplicación C++ cargar el archivo .jar usando JNI?

¿Puede alguien explicar, si es posible hacerlo de esa manera o debería buscar la otra opción?

El código es así:

class JNIInterface 
{ 
private: 
JavaVMInitArgs vm_args; 
JavaVM *jvm; 
JNIEnv *env; 
long result; 
jmethodID mid; 
jfieldID fid; 
jobject jobj; 
jclass cls; 
int asize; 
char JVMOptionString[20]; 
char className[20]; 
char methodName[20]; 
JavaVMOption options[1]; 

public: 
JNIInterface(char* JVMOptionString) 
{ 
// JavaVMOption options[1]; 
    options[0].optionString = JVMOptionString; 
    vm_args.options = options; 
    vm_args.nOptions = 1; 

    vm_args.version = JNI_VERSION_1_6; 
    vm_args.ignoreUnrecognized = JNI_FALSE; 
} 
void setClassName(char* className) 
{ 
    result = JNI_CreateJavaVM(&jvm,(void **)&env, &vm_args); 
    if(result == JNI_ERR) 
    { 
    printf("Error invoking the JVM\n"); 
    //return 0; 
    } 
    cls = env->FindClass("F2C"); 
    if(cls == NULL) 
    { 
    printf("can't find class F2C\n"); 
    //return 0; 
    } 

    env->ExceptionClear(); 
} 

void setMethodName(char* methodName) 
{ 
    cout<<"---------- Function Name is "<<methodName<<endl; 

    //---------- Integer Value with Parameter ---------------- 
    mid=env->GetStaticMethodID(cls, methodName, "([Ljava/lang/String;)V"); 
    if (mid != NULL) 
    { 
    env->CallStaticVoidMethod(cls,mid,"70"); 
    } 
int main() 
{ 
JNIInterface JNIInterfaceObj("-Djava.class.path=C:\\MyPOC;C:\\MyPOC\\herong.jar"); 

    JNIInterfaceObj.setClassName("F2C"); 

JNIInterfaceObj.setMethodName("main"); 
return 0; 
} 

.

//The java file which is calling jar files is - F2C.java 

/** 
* F2C.java 
* Copyright (c) 2006 by Dr. Herong Yang, http://www.herongyang.com/ 
*/ 
import herong.TempratureConvertorBean; 

public class F2C { 

public void test(String[] arg) { 
    try { 

    double f = 0.0; 
    System.out.println("Inside test func:"); 
    TempratureConvertorBean b = new TempratureConvertorBean(); 

    if (arg.length>0) f = Double.parseDouble(arg[0]); 
    b.setFahrenheit(f); 
    double c = b.getCelsius(); 
    System.out.println("Fahrenheit = "+f); 
    System.out.println("Celsius = "+c); 
    System.out.println(b.getInfo()); 

    } 
} 

public static void main(String[] arg) { 
    F2C f2c = new F2C(); 
     f2c.test(arg); 
    } 
} 

este F2C.java utiliza el archivo herong.jar

Para sugerir si tiene alguna idea. Gracias , Asg

Respuesta

3

Su pregunta no está completamente claro, pero voy a dar una respuesta general ...

En Java sólo hay dos maneras de conseguir Java para buscar en un archivo .jar (y en realidad se reducen a una forma al final), y eso es para especificar el archivo .jar en classpath, o para crear un cargador de clases que buscará en ese archivo jar y lo agregará a la lista de cargadores de clase que Java usará.

Y, por supuesto, todo el classpath es un conjunto de cargadores de clases que Java instancia y usa antes de que el programa siquiera se inicie.

Así que un programa JNI necesita hacer las llamadas Java (que no estoy buscando ahora) para configurar un nuevo cargador de clases y obtener que Java lo use si el programa JNI necesita Java para comenzar a buscar en otras archivos .jar

Cuestiones relacionadas