需要将c中的struct数组从jni返回到java(作为对象数组) 我必须返回一组结构值从C++(jnI)到java。我有如下的C++结构: MyCStructure { byte *Data; int dataLength; int width; int height; }mycstr;
我的java结构如下需要将c中的struct数组从jni返回到java(作为对象数组) 我必须返回一组结构值从C++(jnI)到java。我有如下的C++结构: MyCStructure { byte *Data; int dataLength; int width; int height; }mycstr;,java,c++,object,java-native-interface,Java,C++,Object,Java Native Interface,我的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
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传递对象数组(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个结构数组(mycsstructure)值,我试图在MyJavaStructure类对象中赋值,但返回null
我做得对吗?还是我必须改变什么
jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr);
你显然不能那样做mycstr
不是jobject
,也不是指向jobject
的指针jobject
本身已经是一个指向不透明结构的指针,您不应该对它感兴趣,因为它将您从对特定JNI实现的依赖中分离出来
由于一组可从C调用的JNI函数,C中的本机代码可以理解Java类和对象。在Java方面,理解本机对象并不是相互的所以答案是否定的,你做得不对。
如果希望在Java和本机之间同步结构(简单类),请将类实例作为jobject传递给本机调用,并使用
GetFieldID
后跟(例如)Get/SetIntField
如果它是一个单结构,我可以使用Get/Set字段。我需要传递结构数组。“mycstr”包含4个值的结构。您的java方法setValues(myjavastructurebdetails)
只接受一个实例,而不是一个数组,因此它无论如何都不会工作。因此,您需要将数组封装在一个类中,并使用方法setDataLength(indexInArray,value)
和类似的方法,并通过JNI调用这些方法。实际上,没有任何方法可以绕过如何将C对象直接移交给Java。