【问题标题】:Need to return an array of struct in c from jni to java (as Object array)需要将 c 中的结构数组从 jni 返回到 java(作为对象数组)
【发布时间】:2013-02-12 06:53:37
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:
    jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr);
    

    你显然不能这样做。 mycstr 不是jobject,也不是指向jobject 的指针。 jobject 本身已经是一个指向不透明结构的指针,你不应该有兴趣将你从对特定 JNI 实现的依赖中解耦出来。

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

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

    【讨论】:

    • 如果它是一个单一的结构,我可以使用获取/设置字段。我需要传递结构数组。 'mycstr' 包含具有 4 个值的结构。
    • 您的 java 方法 setValues(MyJavaStructure bDetails) 采用单个实例,而不是数组,因此无论如何它都不会工作。因此,您需要将数组包装在一个类中,并拥有 setDataLength(indexInArray,value) 和类似方法,并通过 JNI 调用它们。真的没有绕过如何将 C 对象直接交给 Java。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2022-10-05
    • 2011-09-02
    • 2012-01-11
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多