2011-01-11 5 views
6

C에서 Java로로드되는 DLL을 생성 중입니다. Java에서 C 함수를 호출하고 C에서 Java 함수를 호출합니다 (whith uncomplex 데이터 형식). 정상적으로 작동합니다.JNI를 사용하여 C 구조체를 Java로 전송하는 방법은 무엇입니까?

저는 C 구조체를 Java로 전송하는 데 어려움을 겪고 있습니다.

여기 내가 원하는 것을 설명하는 작은 예제가 있습니다. 내 문제는 내가 어떻게해야할지 모르므로 완전하지 않고 정확하지 않을 수 있습니다.

제 목표는 Java 프로그램의 값을 사용하기 위해 C에서 Java로 유형 "StructType"의 구조를 전달하는 것입니다. 당신의 도움에 미리 자바

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 함수의 구조체에서 setter 및 getters (예를 들어)를 사용하여 Java 객체에 액세스하려면 어떻게해야합니까? –

+0

이 답변을 업데이트했습니다. –

1

이 질문에 내 게시물을 확인합니다 pass data between Java and C

+0

감사합니다 블라디미르 및 dacwe. 이제는 제대로 작동하게되었습니다. –

관련 문제