2016-10-06 11 views
0

私はこのエラーを取得:Cでjniを使用したCメソッドの型の競合?

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 
          ^

私のコードは次のようになります。

#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は何ですか?事前に

/* 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 

ありがとう:ここ
は.hファイルです!

答えて

2

あなたの宣言ファイル(.h)に気付いた場合、あなたの署名は

JNIEXPORT jobjectArray JNICALL Java_model_JNIResultSet_getSpieler (JNIEnv *, jobject); お知らせjobjectArrayは、あなたの戻り値の型です。

実装では、戻り値の型をstruct Spieler *に置き換えます。 jobjectArrayは、Java配列型(プリミティブJava配列)でなければならないことを意味しているため、最後に、問題に遭遇するでしょう。jobjectArrayこれは、有効なCのためにこのようにタイプをミスマッチできません。

最後に、

ネイティブ構造をJVMに直接戻すことはできません。あなたの意図であるとします。

、正しくこの作品を作るために()[Lmodel/SpielerのあなたのJNI署名に基づいて、あなたは(JNIEnvののNewObjectArrayメソッドを使用して)配列を作成する必要があり、その後、Javaのmodel.Spielerオブジェクトをインスタンス化し、その配列の中に入れて、それを返します。 C構造体のデータをJavaオブジェクトにコピーする必要があります。

+0

リンクされたリストを返すには、 'jlong​​'を返すのが最善の方法ですか? – mafioso

+0

申し訳ありませんが、あなたの意図がモデルの配列を返すことを実現していると私のコメントを更新しました.Spielerオブジェクト。 Java側からのポインタを使用すると、とにかく不満の練習になります。 – yano

関連する問題