2010-04-13 18 views
11

मेरे पास जावा विधि तक पहुंचने के लिए जेएनआई विधि है जो एक इंटेगर ऑब्जेक्ट देता है। मैं आदिम int प्रकार को वापस नहीं करना चाहता क्योंकि यह कोड सामान्य वस्तुओं को संभालने के लिए संशोधित किया जाएगा। मेरे पास निम्नलिखित है। मैं जो इंटीजर पास करता हूं उसका मूल्य प्राप्त नहीं कर पा रहा हूं। सी ++ पक्ष में उत्पादन होता हैजेएनआई जावा ऑब्जेक्ट (इंटीजर) तक पहुंचने के लिए कैसे करें

value = 0x4016f3d0 

मुझे लगता है कि मैं सी ++ अंत में पारित पूर्णांक वस्तु के वास्तविक मूल्य कैसे प्राप्त कर सकते हैं की तरह कुछ?

कृपया मदद करें।

धन्यवाद,

एच

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 एवा

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 विधि आह्वान करने के लिए अपने आदिम मूल्य प्राप्त करने के लिए है। क्लास java.lang.Integer और फिर GetMethodID और CallObjectMethod का संदर्भ प्राप्त करने के लिए विधि को वास्तव में आमंत्रित करने के लिए GetObjectClass (आपके कोड में) के बजाय FindClass का उपयोग करें।

9

धन्यवाद जर्नबोजो,

यह अब काम करता है! यह मैं क्या है:

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

+2

क्यों 'Ljava/लैंग/पूर्णांक काम नहीं कर रहा है,', और नहीं 'Ijava/लैंग/पूर्णांक;'? –

संबंधित मुद्दे