2009-09-16 19 views
7

私はCにあまり慣れていませんが、JavaコードでCライブラリを使用する必要があります。私は、DLLを作成し、それを正常にアクセスすることができますが、私はCコードからjavaコードにintの配列を返そうとしています。JNAを使用してC配列をJavaに戻す

Cでは、単に配列へのポインタを返すことができると思っていましたが、Javaコードで期待したように機能しません。私は

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

それが正常に動作を行うことによって、C++でこれをテストする場合

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

と私は739、255は期待のような値を得る:ここではCコードです。

(が、これは私に739を与える-16777214)私はそうのようなJNAパッケージで、Javaでそれを使用してみてください:JNAのドキュメントで

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

そのようなint *bufなどのプリミティブ配列はint[] bufにマッピングされると言いますJavaで、私はIntByReferenceからint[]に戻り値の型を変更しようとすると、私はillegalArgumentExceptionを取得します。

私はCから配列を正しく返すのか、それともJavaで正しくアクセスしていないのか分かりません。どんな助けもありがとう。

答えて

4

返された配列は決して解放/削除されないため、このような関数は使用しません。 に私ができる場合、私はむしろ、Cの関数を変更します

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

6

Cコードは良いです(他のコメントを参照してください)、しかし、主な問題は私がポインタのJava getInt()メソッドを悪用していたことです。私はgetIntArray()を使っていたはずです。

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

コールバック自体を作成し、あなたがgetByteArray(int)を使用し、または -

3

長く、おそらくより明確な説明は、あなたがポインタ(またはポインタの後継)を受け取るためにあなたのJava関数をプロトタイプということです他のgetArraysの1つ

byte[] myFunc(Pointer resuls, int numBytes) 
{ 
    return Pointer.getByteArray(numBytes); 
} 
関連する問題