2010-01-08 74 views
5

感謝您看看問題。 我想調用一個java方法,它是在類文件中使用JNI接口。反過來,被調用的類文件應該執行駐留在同一個目錄中的另一個.jar文件?我很難實現這一點,並且我在執行.jar文件時不成功。我的意思是我無法從.jar文件中的類fuile中獲得結果。C++應用程序可以使用JNI加載.jar文件嗎?

任何人都可以解釋,是否可以這樣做,或者我應該尋找另一種選擇?

的代碼是這樣的:

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才能開始查找附加信息,那麼JNI程序需要進行Java調用(我現在沒有查找)來設置新的類加載器並讓Java開始使用它.jar文件。

相關問題