使用JNA将C数组返回给Java

使用JNA将C数组返回给Java,java,arrays,jna,Java,Arrays,Jna,我不太熟悉C,但我需要在java代码中使用C库。我已经创建了DLL,并且能够很好地访问它,但是我正在尝试将一个int数组从C代码返回到java代码 在C语言中,我认为您可以简单地返回一个指向数组的指针,但它并不像我在Java代码中预期的那样工作。以下是C代码: int * getConusXY(double latitude, double longitude) { maparam stcprm; double reflat = 25, reflon = -95,

我不太熟悉C,但我需要在java代码中使用C库。我已经创建了DLL,并且能够很好地访问它,但是我正在尝试将一个int数组从C代码返回到java代码

在C语言中,我认为您可以简单地返回一个指向数组的指针,但它并不像我在Java代码中预期的那样工作。以下是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;
}
<如果在C++中通过做

来测试这个
int* xy = getConusXY(33.92, -84.33);
cout << xy[0] << " " << xy[1] << endl;
在JNA文档中,它说诸如
int*buf
之类的基本数组将映射到Java中的
int[]buf
,但是当我尝试将返回类型从
IntByReference
更改为
int[]
时,我得到了一个非法的argumentexception


我不知道是从C正确返回数组,还是在Java中没有正确访问数组。任何帮助都将不胜感激。

C代码很好,应该会更好(请参阅其他注释),但是,主要问题是我对指针误用了java
getInt()
方法。似乎我应该使用
getIntArray()

更长更清楚的解释是,您可以将Java函数原型化以接收指针(或指针的后续函数)——

创建回调本身时,使用getByteArray(int)或其他getArray之一

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

我不会使用这样的函数,因为返回的数组永远不会被释放/删除。 如果可以,我宁愿更改C函数:

void myFunc(指针结果、整数字节、字节常量*returnArray)

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