2010-04-13 32 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