2010-04-13 21 views
11

Tengo un método JNI para acceder al método java que devuelve un objeto Integer. No deseo devolver el tipo int primitivo porque este código se modificará para manejar objetos genéricos. Lo siguiente es lo que tengo. No puedo obtener el valor del número entero que paso. La salida en el lado C++ es algo así comoJNI cómo acceder a Java Object (Integer)

value = 0x4016f3d0 

¿Cómo puedo obtener el valor real del objeto entero que me pase en C++ final?

Por favor ayuda.

Gracias,

-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 (clase principal)

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

Respuesta

11

usted tiene que invocar el método intValue en la instancia de enteros para obtener su valor primitivo. Use FindClass en lugar de GetObjectClass (como en su código) para obtener una referencia a la clase java.lang.Integer y luego a GetMethodID y CallObjectMethod para invocar realmente el método intValue.

9

Gracias Jarnbjo,

¡Funciona ahora! Esto es lo que tengo:

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

alta, por encima de código no funciona para mí .. – RAJESH

+2

Por qué 'Ljava/lang/Integer;' y no 'Ijava/lang/Integer;'? –