JNI如何访问Java对象(整数)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2630529/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JNI how to access Java Object (Integer)
提问by user271290
I have a JNI method to access java method which returns an Integer object. I do not want to return the primitive int type because this code will be modified to handle Generic objects. The following is what I have. I am not able to get the value of the Integer that I pass. The output at C++ side is something like
我有一个 JNI 方法来访问返回一个 Integer 对象的 java 方法。我不想返回原始 int 类型,因为将修改此代码以处理 Generic 对象。以下是我所拥有的。我无法获得我传递的 Integer 的值。C++ 端的输出类似于
value = 0x4016f3d0
How can I get the actual value of Integer object that I pass at C++ end?
如何获得我在 C++ 端传递的 Integer 对象的实际值?
Please help.
请帮忙。
Thanks,
谢谢,
-H
-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
通用Peer.java
public class GenericPeer {
public static native void print(Data d);
static {
System.load("/home/usr/workspace/GenericJni/src/libGenericJni.so");
}
}
Data.java
数据.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)
Test.java(主类)
public class Test {
public static void main(String[] args){
Integer i = new Integer(1);
Data d = new Data(i);
GenericPeer.print(d);
}
}
采纳答案by jarnbjo
You have to invoke the intValue
method on the Integer instance to get its primitive value. Use FindClass
instead of GetObjectClass
(as in your code) to get a reference to the class java.lang.Integer and then GetMethodID
and CallObjectMethod
to actually invoke the intValue
method.
您必须调用intValue
Integer 实例上的方法以获取其原始值。使用FindClass
替代GetObjectClass
(如在你的代码),以获得对类java.lang.Integer中的引用,然后GetMethodID
与CallObjectMethod
实际调用的intValue
方法。
回答by user271290
Thanks Jarnbjo,
谢谢Jarnbjo,
It works now! This is what I have:
它现在有效!这就是我所拥有的:
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);
}