2010-04-13 15 views
11

Bir Tamsayı nesnesini döndüren java yöntemine erişmek için bir JNI yöntemim var. İlkel int türünü döndürmek istemiyorum çünkü bu kod, Genel nesneler işlemek için değiştirilecek. Aşağıda sahip olduğum şey. Geçtiğim Tamsayı'nın değerini alamıyorum. C++ tarafında çıkışıJNI Java Nesnesine nasıl erişilir (Tamsayı)

ben C++ sonunda geçmesine Integer nesnesi gerçek değerini nasıl alabilirim
value = 0x4016f3d0 

gibi bir şey?

Lütfen

Yardım edin.

sayesinde

H

GenericPeer.cpp

JNIEXPORT void JNICALL Java_GenericPeer_print (JNIEnv *jenv, jclass jcls, jobject data){ 
jclass peerCls = jenv->GetObjectClass(data); 
jmethodID mGetValue = jenv->GetMethodID(peerCls, "getValue","()Ljava/lang/Integer;"); 
if(mGetValue == NULL){ 
    return (-1); 
} 
jobject value = jenv->CallObjectMethod(data, mGetValue); 
cout<<"value = "<<value<<endl; 

} 

GenericPeer.java

public class GenericPeer { 
public static native void print(Data d); 
static { 
    System.load("/home/usr/workspace/GenericJni/src/libGenericJni.so"); 
} 
} 

Data.j Ava

public class Data { 
private Integer value; 
pubilc Data(Integer v){ 
    this.value = v; 
} 
public Integer getValue() { return value; } 
    public void setValue(Integer value) { 
this.value = value; 
} 
} 

Test.java (ana sınıfı)

public class Test { 
public static void main(String[] args){ 
     Integer i = new Integer(1); 
    Data d = new Data(i); 
    GenericPeer.print(d); 
     } 
} 

cevap

11

Bunu temel değerini elde etmek için tamsayı örneği üzerinde intValue yöntemi çağırmak zorundadır. Gerçekte intValue yöntemini çağırmak için java.lang.Integer sınıfına ve GetMethodID ve CallObjectMethod sınıfına başvuru almak için GetObjectClass (kodunuzda olduğu gibi) yerine FindClass kullanın.

9

Teşekkürler Jarnbjo,

Şimdi çalışıyor! Bu benim ne var:

JNIEXPORT jint JNICALL Java_GenericPeer_print (JNIEnv *jenv, jclass jcls, jobject data){ 
     jclass peerCls = jenv->GetObjectClass(data); 

    jmethodID mGetValue = jenv->GetMethodID(peerCls, "getValue","()Ljava/lang/Integer;"); 
    if (mGetValue == NULL){ 
     return(-1); 
    } 

    jobject value = jenv->CallObjectMethod(data, mGetValue); 
    if(value == NULL){ 
     cout<<"jobject value = NULL"<<endl; 
     return(-1); 
    } 

    //getValue() 

    jclass cls = jenv->FindClass("java/lang/Integer"); 
    if(cls == NULL){ 
     outFile<<"cannot find FindClass(java/lang/Integer)"<<endl; 
    } 
     jmethodID getVal = jenv->GetMethodID(cls, "intValue", "()I"); 
     if(getVal == NULL){ 
     outFile<<"Couldnot find Int getValue()"<<endl; 
     } 
     int i = jenv->CallIntMethod(value, getVal); 
} 
+1

hi, kod üzerinde .. – RAJESH

+2

Neden 'Ljava/lang/tamsayı benim için çalışmıyor;' değil, 'Ijava/lang/tamsayı;'? –