JNI, как получить доступ к Объекту Java (Целое число)

У меня есть метод JNI для доступа к методу Java, который возвращает Целочисленный объект. Я не хочу возвращать примитивный международный тип, потому что этот код будет изменен для обработки Родовых объектов. Следующее - то, что я имею. Я не могу получить значение Целого числа, которое я передаю. Вывод в стороне C++ - что-то как

value = 0x4016f3d0

Как я могу получить фактическое значение Целочисленного объекта, который я передаю в конце 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.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 (Основной класс)

public class Test {
 public static void main(String[] args){
       Integer i = new Integer(1);
  Data d = new Data(i);
  GenericPeer.print(d);
      }
}
12
задан user271290 13 April 2010 в 14:53
поделиться

2 ответа

Вы должны вызвать метод intValue в экземпляре Integer, чтобы получить его примитивное значение. Используйте FindClass вместо GetObjectClass (как в вашем коде), чтобы получить ссылку на класс java.lang.Integer, а затем GetMethodID и CallObjectMethod , чтобы фактически вызвать метод intValue .

11
ответ дан 2 December 2019 в 18:18
поделиться

Спасибо, 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);
}   
9
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: