需要将c中的struct数组从jni返回到java(作为Object数组)

时间:2013-02-12 06:53:38

标签: java c++ object java-native-interface

我必须将一系列结构值从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。

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

1 个答案:

答案 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>