2011-01-11 19 views
6

Od C Tworzę bibliotekę DLL, która jest ładowana w Javie. Wywołuję niektóre funkcje C z java, a także wywołuję funkcje Java z C (z typami danych nieskompleksowych) - to działa poprawnie.Jak przenieść strukturę C do java za pomocą JNI?

Walczę z przeniesieniem struktury C do Javy.

Oto mały przykład opisujący to, co chcę zrobić. To nie jest kompletne i może nie jest poprawne, ponieważ moim problemem jest to, że nie jestem pewien, jak to zrobić.

Moim celem jest przekazanie struktury z typu "StructType" z C do Javy w celu użycia wartości w programie Java.

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

W Javie

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

Dzięki z góry za pomoc.
Steffen

Odpowiedz

0

Proponuję zwrócić tablicę int, o ile twoja struktura nie składa się z niczego innego.

Jeśli chodzi o zwracanie obiektu: możesz utworzyć obiekt klasy StructType, wypełnij wartości setterami i zwróć je.

Potrzebne próbki kodu można znaleźć here.

Po prostu nie sprawdziłem tego kodu.

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

Dzięki Vladimir. Struktura jest nieco bardziej skomplikowana niż w przykładzie i muszę z niej korzystać. Ale jak mogę uzyskać dostęp do obiektu java ze struktury w funkcji C, aby użyć ustawiających i pobierających (po przykładzie)? –

+0

zaktualizował odpowiedź. –

Powiązane problemy