2010-01-08 4 views
5

Vielen Dank für einen Blick auf Frage. Ich versuche, eine Java-Methode aufzurufen, die in Klassendateien mit JNI-Schnittstelle ist. Die aufgerufene Klassendatei sollte wiederum die andere .jar-Datei ausführen, die sich im selben Verzeichnis befindet? Ich hatte es schwer, dies zu erreichen, und es ist mir nicht gelungen, die .jar-Datei auszuführen. Ich meine, ich bin nicht in der Lage, die Ergebnisse aus der Klasse Fuile in .jar-Datei zur Verfügung zu bekommen.Kann C++ - Anwendung die JAR-Datei mit JNI laden?

Kann jemand erklären, ob es möglich ist, so zu tun, oder sollte ich nach der anderen Option suchen?

Der Code ist wie folgt:

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); 
    } 
} 

diese F2C.java verwendet die herong.jar Datei

Bitte vorschlagen, wenn Sie eine Idee haben. Danke, Asg

Antwort

3

Ihre Frage nicht ganz klar ist, aber ich werde eine allgemeine Antwort geben ...

In Java gibt es nur zwei Möglichkeiten, um Java in einer .jar-Datei zu suchen zu bekommen (und Sie laufen am Ende wirklich auf einen Weg), und zwar um die .jar-Datei im Klassenpfad anzugeben oder um einen Klassenlader zu erstellen, der in dieser JAR-Datei sucht und sie der Liste der von Java verwendeten Klassenladeprogramme hinzufügt.

Und natürlich ist der gesamte Klassenpfad eine Sammlung von Klassenladern, die Java instanziiert und verwendet, bevor Ihr Programm überhaupt startet.

Also ein JNI-Programm muss die Java-Aufrufe machen (die ich gerade nicht gerade nachschaue), um einen neuen Klassenlader einzurichten und Java dazu zu bringen, es zu benutzen, wenn das JNI-Programm Java braucht, um zusätzliche Suchen zu starten .jar-Dateien.