2010-01-08 23 views
5

Sorulara baktığınız için teşekkür ederiz. JNI arabirimini kullanarak sınıf dosyalarında bulunan bir java yöntemini çağırmaya çalışıyorum. Sırasıyla çağrılan sınıf dosyası, aynı direcotry içinde bulunan başka bir .jar dosyasını yürütüyor olmalıdır? Bu zorlama zamanım vardı ve .jar dosyasının yürütülmesinde başarısız oldum. Yani, .jar dosyasında bulunan sınıf fuile sonuçlarını elde edemiyorum.Can C++ Uygulama .jar Dosyasını JNI kullanarak yükleyebilir mi?

Bu şekilde yapmanın mümkün olup olmadığını veya herhangi bir seçenek için bakmam gerektiğini herhangi biri açıklayabilir mi?

kod şu şekildedir:

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

bu F2C.java Eğer bir fikrin varsa önerin herong.jar dosyasını

kullanır. Java bir .jar dosyasına bakmak almak için sadece iki yolu vardır Java'da

sayesinde ASG

cevap

3

Sorunuz tamamen açık değildir, ama genel bir cevap verecektir ... (ve gerçekten sonunda bir yoldan aşağıya doğru ilerliyorlar) ve bu, sınıf yolunda .jar dosyasını belirtmek veya bu jar dosyasına bakacak ve Java'nın kullanacağı sınıf yükleyicileri listesine eklenecek bir sınıf yükleyicisi oluşturmaktır.

Ve elbette, tüm sınıf yolu, programınızın başlamasından önce Java'nın başlattığı ve kullandığı bir sınıf yükleyicidir.

JNI programı, yeni bir sınıf yükleyicisi kurmak ve Java'yı JNI programının ek olarak aramaya başlaması için kullanmaya başladığında Java'yı kullanmaya başlamak için Java çağrılarını (şu an bakmadığım) yapmalıdır. .jar dosyaları.

İlgili konular