私は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で正しくアクセスしていないのか分かりません。どんな助けもありがとう。