[英]JNI how to access Java Object (Integer)
我有一个 JNI 方法来访问 java 方法,该方法返回 Integer object。我不想返回原始 int 类型,因为此代码将被修改以处理通用对象。 以下是我所拥有的。 我无法获得我传递的 Integer 的值。 C++ 端的 output 类似于
value = 0x4016f3d0
我怎样才能得到我在 C++ 结束时传递的 Integer object 的实际值?
请帮忙。
谢谢,
-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");
}
}
数据.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);
}
}
您必须在Integer实例上调用intValue
方法以获取其原始值。 使用FindClass
而不是GetObjectClass
(在代码中)来获取对类java.lang.Integer的引用,然后使用GetMethodID
和CallObjectMethod
来实际调用intValue
方法。
谢谢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);
}
您必须通过 jni 接口调用intValue()
方法。
FindClass
得到Integer
class 引用。intValue
方法,请使用CallIntMethod
function。这里的方法类型签名是()I
。static int GetIntegerValue(JNIEnv *env, jobject value) {
jclass integer_class = env->FindClass("java/lang/Integer");
return env->CallIntMethod(value, env->GetMethodID(integer_class, "intValue", "()I"));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.