2011-01-11 8 views
6

Cから私はJavaでロードされるDLLを作成しています。 私はjavaからいくつかのC関数を呼び出し、Java関数をCから呼び出します(whith uncomplexデータ型)。これはうまくいきます。JNIを使​​用してC構造体をJavaに転送する方法は?

私はC構造体をJavaに転送するのに苦労します。

ここに、私がしたいことを説明する小さな例があります。 私の問題は私がそれを行う方法がわからないため、完全ではなく、正しくない可能性があります。

私の目標は、Javaプログラムの値を使用するために、CからJavaへの "StructType"タイプの構造体を渡すことです。 Javaの

public class StructType { 
public int value1; /* int because there is no uint8 type */ 
public int value2; 
} 

public StructType mMyStruct; 
public StructType getMyStruct() { 
    return mMyStruct; 
} 
public void setMyStruct(StructType myStruct) { 
    mMyStruct = myStruct; 
} 


public void receiveStructFromC(StructType myStruct) 
{ 
    setMyStruct(myStruct); 
} 

Cで

typedef struct { 
    unsigned char value1; 
    unsigned char value2; 
} StructType; 

void passStructToJava(StructType* myStruct) 
{ 
    class cls; 
    jmethodID mid; 

    /* GlobalEnv, GlobalObj are globlal values which are already set */ 
    cls = (*GlobalEnv)->GetObjectClass(GlobalEnv, GlobalObj); 
    mid = (*GlobalEnv)->GetMethodID(GlobalEnv, cls, "receiveStructFromC", "(LPackage/StructType;)V"); 

    (*GlobalEnv)->CallVoidMethod(GlobalEnv, GlobalObj, mid, myStruct); 
} 

あなたの助けを事前に感謝します。
Steffen

答えて

0

構造体が他のもので構成されていない限り、int配列を返すことをお勧めします。

オブジェクトを戻す方法は、StructTypeクラスのオブジェクトを作成し、その値をセッターで埋めて戻すことができます。

必要なコードサンプルはhereです。

この例では、このコードをチェックしていません。

returnObj = (*env)->AllocObject(env, objClass); 
if (returnObj == 0) printf("NULL RETURNED in AllocObject()\n"); 
printf("Sizeof returnObj = %d\n", sizeof(returnObj)); 

(*env)->SetObjectField (env, returnObj, fid5, 
combinedEmployeeNameJava); 
(*env)->SetIntField (env, returnObj, fid6, combinedSalary); 
+0

感謝ウラジミールを。例のように構造が少し複雑で、私はそれを使う必要があります。しかし、C言語の関数の構造体からJavaオブジェクトにアクセスしてsetterとgetterを使用するにはどうしたらよいですか? –

+0

が答えを更新しました。 –

1

この質問で私のポストをチェックしてください:pass data between Java and C

+0

ありがとうVladimirとdacwe。今私はそれを働かせた。 –

関連する問題