2011-01-11 13 views
6

C'den Java'da yüklü olan bir DLL yaratıyorum. Bazı C işlevlerini java'dan arıyorum ve ayrıca Java işlevlerini C'den (karmaşık olmayan veri türleri ile) arayalım - bu iyi çalışıyor.JNI kullanılarak bir C yapısını java'ya nasıl transfer edilir?

Bir C yapısının Java'ya aktarımı ile uğraşıyorum.

Burada yapmak istediğimi açıklayan küçük bir örnek var. Tam değil ve belki de doğru değil çünkü sorunum, nasıl yapacağımı bilmiyorum.

Amacım, Java programındaki değerleri kullanmak için C'den Java'ya "StructType" türünden bir yapı iletmektir. Yardımlarınız için şimdiden 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); 
} 

Teşekkür yılında 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); 
} 

yılında

.
Steffen

cevap

0

Yapınızın başka bir şey içermediği sürece bir int dizisi döndürmenizi öneririm.

Nesneyi döndürmek için: StructType sınıfınızın bir nesnesini oluşturabilir, değerleri ayarlayıcılarla doldurup geri gönderebilirsiniz.

Gerekli kod örnekleri here bulunabilir.

Örnek olarak, bu kodu kontrol etmedim.

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

Teşekkür Vladimir. Yapı, örnekte olduğu gibi biraz daha karmaşıktır ve kullanmam gerek. Ancak java nesnesine C işlevindeki yapıdan setter ve alıcıları (örneğe göre) kullanmak için nasıl erişebilirim? –

+0

cevabı güncelledi. –

İlgili konular