2010-04-13 5 views
11

J'ai une méthode JNI pour accéder à la méthode java qui renvoie un objet Integer. Je ne veux pas renvoyer le type int primitif car ce code sera modifié pour gérer les objets génériques. Ce qui suit est ce que j'ai. Je ne suis pas en mesure d'obtenir la valeur de l'entier que je transmets. La sortie à côté de C est quelque chose commeJNI comment accéder à l'objet Java (entier)

value = 0x4016f3d0 

Comment puis-je obtenir la valeur réelle de l'objet entier que je passe à C++ fin?

Aidez-nous s'il vous plaît.

Merci,

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

Répondre

11

Vous devez appeler la méthode intValue sur l'instance entière pour obtenir sa valeur primitive. Utilisez FindClass au lieu de GetObjectClass (comme dans votre code) pour obtenir une référence à la classe java.lang.Integer puis GetMethodID et CallObjectMethod pour appeler réellement la méthode intValue.

9

Merci Jarnbjo,

Cela fonctionne maintenant! Voilà ce que j'ai:

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

salut, au-dessus du code ne fonctionne pas pour moi .. Pourquoi – RAJESH

+2

'Ljava/lang/entier;', et non 'Ijava/lang/entier;'? –