2011-01-11 38 views
6

Từ C Tôi đang tạo một tệp DLL được tải bằng Java. Tôi gọi một số hàm C từ java và cũng gọi các hàm Java từ C (các kiểu dữ liệu không phức tạp) - điều này hoạt động tốt.Làm thế nào để chuyển một cấu trúc C sang java bằng cách sử dụng JNI?

Tôi đấu tranh với việc chuyển giao cấu trúc C sang Java.

Dưới đây là một ví dụ nhỏ mô tả những gì tôi muốn làm. Nó không đầy đủ và có thể không chính xác bởi vì vấn đề của tôi là tôi không chắc chắn làm thế nào để làm điều đó.

Mục tiêu của tôi là chuyển cấu trúc từ loại "StructType" từ C sang Java để sử dụng các giá trị trong chương trình Java.

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

Trong 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ảm ơn trước sự giúp đỡ của bạn.
Steffen

Trả lời

0

tôi sẽ đề nghị trả lại một mảng int, như xa như cấu trúc của bạn không bao gồm bất cứ điều gì khác.

Để trả lại đối tượng: bạn có thể tạo đối tượng của lớp StructType, điền các giá trị bằng bộ định vị và trả về.

Có thể tìm thấy các mẫu mã cần thiết here.

Chỉ ví dụ, tôi chưa kiểm tra mã này.

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ảm ơn Vladimir. Cấu trúc phức tạp hơn một chút như trong ví dụ và tôi cần sử dụng nó. Nhưng làm thế nào tôi có thể truy cập đối tượng java từ cấu trúc trong hàm C để sử dụng các bộ định tuyến và getters (theo ví dụ)? –

+0

đã cập nhật câu trả lời. –

1

Kiểm tra bài của tôi trong câu hỏi này: pass data between Java and C

+0

Cảm ơn Vladimir và dacwe. Bây giờ tôi đã nhận nó hoạt động. –

Các vấn đề liên quan