我必须将一系列结构值从c ++(jni)返回到java。我有c ++结构如下
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;
}
我尝试使用setValues的GetMethodId直接从JNI传递Object数组(MyJavaStructure)。
我的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。
我做得对还是在那里我必须改变什么?
答案 0 :(得分:0)
jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr);
你显然不能这样做。 mycstr
不是jobject
,也不是指向jobject
的指针。 jobject
本身已经是指向不透明结构的指针,将您与特定JNI实现的依赖性脱钩不应该是您感兴趣的。
C语言中的本机代码可以理解Java类和对象,这要归功于可以从C调用的JNI函数集。在Java端没有什么可以互相理解本机对象。 所以答案是否定的,你做得不对。
如果希望在Java和native之间同步一个结构(一个简单类),将类实例作为jobject传递给本机调用,并使用GetFieldID
后跟(例如)Get/SetIntField
。< / p>