使用jni的C方法的冲突类型?

时间:2016-10-06 18:47:22

标签: c function 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] = '\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

提前致谢!

1 个答案:

答案 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对象中。