我必须从C++(jni)返回一个结构值数组到Java。我有C++ struture如下需要返回一个结构数组从jni到java(作为对象数组)
MyCStructure
{
byte *Data;
int dataLength;
int width;
int height;
}mycstr;
,我有我的Java结构
public class MyJavaStructure
{
public byte[] Data;
public int dataLength;
public int width;
public int height;
}
而且我JavaMainClass.java是
MyJavaStructure[] mystr = MyJavaStructure[4];
public native int Process();
public LSImage getValues()
{
return this.mystr ;
}
public void setValues(MyJavaStructure bDetails)
{
this.mystr = bDetails;
}
我试图通过对象数组( MyJavaStructure)直接从JNI使用setValues的GetMethodId。
我JNI代码是
JNIEXPORT jint JNICALL Java_TestJNI_Process(JNIEnv *jEnv, jobject jObj)
{
MyCStructure* mycstr = new MyCStructure[4];
iRet = Process(&mycstr);
jclass jClass = jEnv->GetObjectClass(jObj);
jmethodID constructor;
jmethodID jObjectID = jEnv->GetMethodID (jLegendClass, "setValues", "(LMyCStructure;)V");
if (jObjectID == NULL)
{
throwJavaException(jEnv, "Unable to find the method setValues");
return NULL;
}
jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr);
printf ("After setting the output data value\n");
jEnv->DeleteLocalRef(jClass);
return iRet;
}
在mycstr返回值包含4阵列结构(MyCStructure)值的和我试图在一个MyJavaStructure类对象分配,但它返回null。
我在做对吗还是在那里我必须改变什么?
如果它是一个单一的结构,我可以使用Get/Set Fields。我需要传递一些结构。 'mycstr'包含具有4个值的结构。 – Narayan 2013-02-13 10:01:01
你的java方法'setValues(MyJavaStructure bDetails)'只接受一个实例,而不是一个数组,所以它不会工作。所以你需要将你的数组封装在一个类中,并且有setDataLength(indexInArray,value)等类似的方法,并通过JNI调用它们。没有绕过如何直接将C对象直接交给Java,真的。 – 2013-02-13 11:37:49
好吧,我会找到一个合适的方式并发布它 – Narayan 2013-02-13 11:46:11