我必須從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