2010-04-13 372 views
11

我有一个JNI方法来访问返回Integer对象的java方法。我不想返回原始的int类型,因为此代码将被修改为处理Generic对象。以下是我的。我无法获得通过的Integer的值。在C++侧的输出是一样的东西JNI如何访问Java对象(Integer)

value = 0x4016f3d0 

我怎样才能得到Integer对象的实际价值,我通过在C++结束了吗?

请帮忙。

感谢,

-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(主类)

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

回答

11

你要调用的整数实例intValue方法来获得其原始值。使用FindClass而不是GetObjectClass(如在您的代码中)获取对java.lang.Integer类的引用,然后使用GetMethodIDCallObjectMethod来实际调用intValue方法。

9

谢谢Jarnbjo,

它现在的作品!这是我有:

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

喜,上面的代码是不是为我工作.. – RAJESH 2012-11-20 11:28:14

+2

为什么'Ljava /朗/整数',而不是'Ijava /郎/整数;'? – 2016-06-09 18:12:20