Конфликтующие типы для метода C с использованием jni?

#c #function #java-native-interface

#c #функция #java-native-interface

Вопрос:

Я получаю эту ошибку:

 conflicting types for ‘Java_model_JNIResultSet_getSpieler’
Java_model_JNIResultSet_getSpieler() {
^
In file included from SharedTable.c:5:0:
model_JNIResultSet.h:15:32: note: previous declaration of ‘Java_model_JNIResultSet_getSpieler’ was here
JNIEXPORT jobjectArray JNICALL Java_model_JNIResultSet_getSpieler
                            ^
  

Мой код на C выглядит так:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jni.h>
#include "model_JNIResultSet.h"

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

struct Spieler *head = NULL;
struct Spieler *current = NULL;



JNIEXPORT struct Spieler* JNICALL
Java_model_JNIResultSet_getSpieler() {
int c;
int count = 0;
FILE *file;
char myStrings[MAXCHARS];

file = fopen("Spieler.txt", "r");
if (file) {
    while ((c = getc(file)) != EOF) {
        myStrings[count] = c;
        count  ;
    }
    fclose(file);
}

int len = strlen(myStrings);
int j = 0;
int attributeCount = 1;
char newArray[MAXCHARS];

for (c = 0; c < len - 1; c  ) {
    if (myStrings[c] != 'n') {
        newArray[j] = myStrings[c];
        j  ;
    } else {
        j = 0;
        if (attributeCount == 4) {
            attributeCount = 1;
        }
        //newArray[strlen(newArray) 1] = '';
        insertFirst(newArray, attributeCount);
        attributeCount  ;
        memset(newArray, 0, sizeof(newArray));
    }
}

// reverse the data
reverse(amp;head);

return head;
}
  

В чем здесь может быть ошибка? Я понятия не имею, и я тоже долго искал, но я не знаю, как это исправить.
Что может быть previous declaration в файле .h?
Вот файл .h:

 /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class model_JNIResultSet */

#ifndef _Included_model_JNIResultSet
#define _Included_model_JNIResultSet
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     model_JNIResultSet
* Method:    getSpieler
* Signature: ()[Lmodel/Spieler;
*/
JNIEXPORT jobjectArray JNICALL Java_model_JNIResultSet_getSpieler
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
  

Заранее спасибо!

Ответ №1:

Если вы заметили в своем файле объявления (.h), ваша подпись

JNIEXPORT jobjectArray JNICALL Java_model_JNIResultSet_getSpieler
(JNIEnv *, jobject);
Обратите jobjectArray внимание, что это ваш возвращаемый тип.

В вашей реализации вы заменяете возвращаемый тип на struct Spieler * . Вы не можете таким образом сопоставлять типы для допустимого C.

Наконец, вы столкнетесь с проблемой, потому jobjectArray что означает, что это должен быть тип массива Java (примитивный массив Java).

Вы не можете возвращать собственные структуры прямо в JVM таким образом, предполагая, что это ваше намерение.

Чтобы это работало правильно, на основе вашей подписи JNI of ()[Lmodel/Spieler , вам нужно будет создать массив (используя NewObjectArray метод JNIEnv), а затем создать экземпляр model.Spieler объекта Java, поместить его в этот массив и вернуть его. Вам нужно будет скопировать данные вашей структуры C в объект Java.

Комментарии:

1. Итак, возврат jlong — лучший способ вернуть мой связанный список?

2. Нет, извините, я обновил свой комментарий, понимая, что ваше намерение состоит в том, чтобы вернуть массив model . Объекты Spieler. Использование указателя со стороны Java в любом случае приведет к разочарованию.