2010-01-08 6 views
5

Спасибо, что посмотрели на вопрос. Я пытаюсь вызвать метод java, который находится в файлах классов, используя интерфейс JNI. В свою очередь вызываемый файл класса должен выполнять другой файл .jar, который находится в том же самом указателе? Мне было нелегко это сделать, и я не смог выполнить файл .jar. Я имею в виду, что я не могу получить результаты из класса fuile, доступного в файле .jar.Может ли приложение C++ загружать файл .jar с помощью JNI?

Может ли кто-нибудь объяснить, можно ли это сделать, или я должен искать другой вариант?

Код выглядит так:

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

этот F2C.java использует файл herong.jar

Пожалуйста, предложите, если у вас есть какие-либо идеи. Спасибо, ASG

ответ

3

Ваш вопрос не совсем ясен, но я дам общий ответ ...

В Java есть только два пути, чтобы получить Java смотреть в .jar файл (и они действительно сводятся к одному пути в конце), и это указать файл .jar в пути к классам или создать загрузчик классов, который будет выглядеть в этом файле jar и добавить его в список загрузчиков классов, которые Java будет использовать.

И, конечно же, весь путь к классам - это набор загрузчиков классов, которые Java создает и использует до начала вашей программы.

Так что программе JNI необходимо сделать вызовы Java (которые я сейчас не ищу), чтобы настроить новый загрузчик классов и заставить Java начать использовать его, если программе JNI требуется Java, чтобы начать поиск в дополнительном .jar.

Смежные вопросы