JNI jak uzyskać dostęp do obiektu Java (Integer)

Mam metodę JNI, aby uzyskać dostęp do metody java, która zwraca obiekt Integer. Nie chcę zwracać prymitywnego typu int, ponieważ ten kod zostanie zmodyfikowany do obsługi obiektów generycznych. Oto, co mam. Nie jestem w stanie uzyskać wartości liczby całkowitej, którą przechodzę. Wyjście po stronie C++ jest czymś w rodzaju

value = 0x4016f3d0

Jak mogę uzyskać rzeczywistą wartość obiektu Integer, który przekazuję na końcu C++?

Proszę pomocy.

Dzięki,

-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.java

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 (Main class)

public class Test {
 public static void main(String[] args){
       Integer i = new Integer(1);
  Data d = new Data(i);
  GenericPeer.print(d);
      }
}
Author: user271290, 2010-04-13

2 answers

Musisz wywołać metodę intValue Na instancji Integer, aby uzyskać jej pierwotną wartość. Użyj FindClass zamiast GetObjectClass (jak w Twoim kodzie), aby uzyskać odniesienie do klasy java.lang.Integer, a następnie GetMethodID i CallObjectMethod do wywołania metody intValue.

 12
Author: jarnbjo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 15:25:43

Dzięki Jarnbjo,

To działa teraz! To jest to co mam:
    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);
}   
 10
Author: user271290,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-14 17:24:09