Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要将c中的struct数组从jni返回到java(作为对象数组) 我必须返回一组结构值从C++(jnI)到java。我有如下的C++结构: MyCStructure { byte *Data; int dataLength; int width; int height; }mycstr;_Java_C++_Object_Java Native Interface - Fatal编程技术网

需要将c中的struct数组从jni返回到java(作为对象数组) 我必须返回一组结构值从C++(jnI)到java。我有如下的C++结构: MyCStructure { byte *Data; int dataLength; int width; int height; }mycstr;

需要将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

我的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传递对象数组(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。