我收到此错误:
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] = '\0';
insertFirst(newArray, attributeCount);
attributeCount++;
memset(newArray, 0, sizeof(newArray));
}
}
// reverse the data
reverse(&head);
return head;
}
这里的错误是什么?我完全不知道,我也搜索了很长时间,但我不知道如何修复它。
什么是.h文件中的previous declaration
?
这是.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
提前致谢!
答案 0 :(得分:2)
如果您在声明(.h)文件中注意到,您的签名是
org.quartz.JobExecutionException:
org.codehaus.groovy.runtime.typehandling.GroovyCastException:
Cannot cast object 'org.grails.orm.hibernate.cfg.NamedCriteriaProxy@2e04ce84'
with class 'org.grails.orm.hibernate.cfg.NamedCriteriaProxy'
to class 'com.company.Widget'
请注意 JNIEXPORT jobjectArray JNICALL Java_model_JNIResultSet_getSpieler
(JNIEnv *, jobject);
是您的返回类型。
在您的实现中,您将使用jobjectArray
替换返回类型。对于有效的C,您不能以这种方式使类型不匹配。
最后,您将遇到问题,因为struct Spieler *
表示它必须是Java数组类型(原始Java数组)。
你不能像这样直接将原生结构返回到JVM,假设这是你的意图。
为了使这项工作正常,基于jobjectArray
的JNI签名,您需要创建一个数组(使用JNIEnv的()[Lmodel/Spieler
方法),然后实例化Java NewObjectArray
对象,把它放在那个数组中,并返回它。您必须将C结构数据复制到Java对象中。