2010-01-08 69 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文件。

相关问题