在C中创建作业并不起作用

时间:2016-10-09 17:16:39

标签: java c java-native-interface

我想使用JNI将jobjectArray从C转移到Java 目前,我收到以下错误:

SharedTable.c: In function ‘JAVA_model_JNIResultSet_getSpieler’:
SharedTable.c:116:5: warning: passing argument 4 of ‘(*env)->SetObjectArrayElement’ from incompatible pointer type [enabled by default]
ret, i, ptr);

我知道我应该返回一个jObject,但我不知道如何创建它 我的结构看起来像这样:

typedef struct _Spieler {
    char vorname[50];
    char nachname[50];
    int trikotnummer;
    struct _Spieler *next;
} Spieler;

我的代码看起来像这样:

Spieler *ptr = head;
jobjectArray ret;
int i;
jclass class = (*env)->FindClass(env, "model/Spieler");

ret= (*env)->NewObjectArray(env, count, class, NULL);

for(i = 0; i < count; i++) {
    (*env)->SetObjectArrayElement(env, ret, i, ptr);
    ptr = ptr->next;
}

return ret;

1 个答案:

答案 0 :(得分:1)

正确地注释 @talex ,您无法使用C结构填充Java数组。您应该声明一个与Spieler结构等效的Java类,并在循环中使用此Java类的构造函数创建数组的每个元素。

类似的东西,

public class Spieler {
    private String vorname;
    private String nachname;
    private int trikotnummer;
    public Spieler(String vorname, String nachname, int trikotnummer) {
        this.vorname = vorname;
        this.nachname = nachname;
        this.trikotnummer = trikotnummer;
    }
};

JNI不是使用构造函数,而是允许您获取Java类字段的字段ID,并单独设置它们(即使它们是私有的)。