#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 в любом случае приведет к разочарованию.