0

我必须将一组结构值从 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 传递对象数组(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。

我做得对还是我必须改变什么?

4

1 回答 1

0
jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr);

你显然不能那样做。mycstr不是jobject,也不是指向 的指针jobjectjobject它本身已经是一个指向不透明结构的指针,你不应该对它与特定 JNI 实现的依赖解耦感兴趣。

由于可从 C 中调用的一组 JNI 函数,C 中的本机代码可以理解 Java 类和对象。Java 方面没有什么互惠的来理解本机对象。所以答案是否定的,你没有做对。

如果你想要一个在 Java 和 native 之间同步的结构(一个简单的类),请将类实例作为 jobject 传递给 native 调用,并使用GetFieldID后跟 (例如) Get/SetIntField

于 2013-02-12T13:22:16.697 回答