2009-09-16 8 views
7

C'ye fazla aşina değilim, fakat java kodumda bir C kitaplığı kullanmam gerekiyor. Ben DLL oluşturduk ve ben sadece iyi erişim mümkün, ama C kodu java kodu için bir dizi ints denemek için çalışıyorum.JNA'yı kullanarak C dizisini C'ye döndürme

C'de, bir göstergeyi diziye döndürdüğümü düşündüm, ancak Java kodumda beklediğim gibi çalışmıyor. Ben

int* xy = getConusXY(33.92, -84.33); 
cout << xy[0] << " " << xy[1] << endl; 

o zaman iyi çalışır yaparak C++ bu test ederseniz

int * getConusXY(double latitude, double longitude) { 
    maparam stcprm; 
    double reflat = 25, reflon = -95, 
      lat1 = 20.191999, lon1 = -121.54001, 
      x1 = 0, y1 = 0, x2 = 1073, y2 = 689, 
      gsize = 5.079, scaLat = 25, scaLon = -95, orient = 0; 
    double x, y; 
    int* xy; 

    xy = malloc(2 * sizeof *xy); 

    stlmbr(&stcprm, reflat, reflon); 
    stcm1p(&stcprm, x1, y1, lat1, lon1, scaLat, scaLon, gsize, orient); 
    cll2xy(&stcprm, latitude, longitude, &x, &y); 

    xy[0] = (int) x; 
    xy[1] = (int) y; 

    return xy; 
} 

ve ben 739, 255 beklendiği gibi değerleri almak: İşte C kodu bulunuyor.

ben şöyle JNA paketi ile Java onu kullanmayı deneyin (ancak bu, bana 739 veriyor -16777214): Böyle int *buf olarak

JNA belgelerinde
public class DmapFDllLibrary { 
    interface DmapFLibrary extends Library { 
     DmapFLibrary INSTANCE = (DmapFLibrary) Native.loadLibrary("DmapFDll", 
       DmapFLibrary.class); 

     IntByReference getConusXY(double latitude, double longitude); 
    } 

    public static void main(String... strings) { 
     IntByReference xy_ref = DmapFLibrary.INSTANCE.getConusXY(33.92, -84.33); 
     Pointer p = xy_ref.getPointer(); 
     System.out.println(p.getInt(0) + " " + p.getInt(1)); 
    } 
} 

diyor ilkel diziler int[] buf eşleştirilir Java, ancak IntByReferenceint[] için dönüş türünü değiştirmeyi denediğimde, ben bir illegalArgumentException alıyorum.

Diziyi doğru olarak C'den mi döndürüyor veya Java'ya doğru şekilde erişemiyorsam bilmiyorum. Herhangi bir yardım takdir edilecektir.

cevap

4

Böyle bir işlevi kullanmayacağım çünkü döndürülen dizi hiçbir zaman boş bırakılamaz/silinmez.

void myFunc(Pointer resuls, int numBytes, byte const * returnArray)

: için elimden eğer Doğrusu C işlevini değiştirecek
6

C kodu ancak ana konu ben işaretçisi java getInt() yöntemi kötüye olmasıdır, (diğer yorumları görmek) iyi olmalıdır gayet iyi. Görünüşe göre getIntArray()'u kullanmalıydım.

byte[] myFunc(Pointer result, int numBytes); 

geri arama kendisini yaratan, sen getByteArray (int) kullanın veya -

3

daha uzun ve belki de daha net bir açıklama Eğer İşaretçi (veya Pointer bir halef) almak üzere Java fonksiyon prototipini yani Diğer getArrays biri.

byte[] myFunc(Pointer resuls, int numBytes) 
{ 
    return Pointer.getByteArray(numBytes); 
}