2011-01-11 105 views
6

從C我創建一個用Java加載的DLL。我調用了一些來自java的C函數,並且還從C調用了Java函數(如果數據類型不復雜) - 這個工作正常。如何通過使用JNI將C結構轉移到java?

我很難將C結構轉換爲Java。

這裏是一個小例子,描述我想要做什麼。 它不完整,也許不正確,因爲我的問題是我不知道該怎麼做。

我的目標是將類型「StructType」中的結構從C傳遞給Java,以便使用Java程序中的值。

在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); 
} 

在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); 
} 

在此先感謝您的幫助。
Steffen

回答

0

我建議返回一個int數組,只要你的結構不包含其他任何東西。至於返回對象:你可以創建StructType類的對象,用setter填充值並返回它。

必要的代碼示例可以找到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和getters(以下示例)? – 2011-01-11 10:43:09

+0

更新了答案。 – 2011-01-11 11:22:03

相關問題