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);
}
}
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
.
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);
}
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