2010-04-13 18 views
11

Ho un metodo JNI per accedere al metodo java che restituisce un oggetto Integer. Non voglio restituire il tipo primitivo int perché questo codice verrà modificato per gestire gli oggetti generici. Quello che segue è quello che ho. Non sono in grado di ottenere il valore dell'intero che ho superato. L'uscita sul lato C++ è qualcosa di simileJNI come accedere a Java Object (Integer)

value = 0x4016f3d0 

Come posso ottenere il valore reale dell'oggetto intero che mi passa in C++ fine?

Per favore aiuto.

Grazie,

-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 (classe principale)

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

risposta

11

Devi richiamare il metodo intValue nell'istanza Integer per ottenere il suo valore di base. Utilizzare FindClass anziché GetObjectClass (come nel codice) per ottenere un riferimento alla classe java.lang.Integer e quindi GetMethodID e CallObjectMethod per richiamare effettivamente il metodo intValue.

9

Grazie Jarnbjo,

ora funziona! Questo è quello che ho:

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, sopra il codice non funziona per me .. – RAJESH

+2

Perché 'Ljava/lang/Integer;', e non 'Ijava/lang/Integer;'? –