Question

Je ne connais pas très bien C, mais je dois utiliser une bibliothèque C dans mon code Java. J'ai créé la DLL et je peux y accéder correctement, mais je tente de renvoyer un tableau d'ints du code C au code java.

En C, je pensais que vous pouviez simplement renvoyer un pointeur sur le tableau, mais cela ne fonctionnait pas comme prévu dans mon code Java. Voici le code 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;
}

Si je teste cela en C ++ en faisant

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

alors cela fonctionne bien et je reçois les valeurs 739, 255 comme prévu.

J'essaie de l'utiliser en Java avec le paquetage JNA comme ça (mais ça me donne 739, -16777214):

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

Dans la documentation de la JNA, il est indiqué que les tableaux primitifs tels que int * buf seraient mappés sur int [] buf en Java, mais lorsque j'essaie de modifier le type de retour IntByReference à int [] puis j'obtiens une exception illégaleArgumentException.

Je ne sais pas si je renvoie correctement le tableau à partir de C ou si je n'y accède pas correctement en Java. Toute aide serait la bienvenue.

Était-ce utile?

La solution

Je ne voudrais pas utiliser une telle fonction, car le tableau retourné ne sera jamais libéré / supprimé. Je préférerais changer la fonction C si je peux:

  

void myFunc (Le pointeur est renvoyé, numBytes int, octet const * returnArray)

Autres conseils

Le code C est correct devrait être meilleur (voir autres commentaires), cependant, le problème principal est que j'ai utilisé de manière abusive la méthode java getInt () pour le pointeur. . Il semble que j'aurais dû utiliser getIntArray () .

L’explication plus longue et peut-être plus claire est que vous prototypez votre fonction Java pour recevoir un pointeur (ou un successeur de celui-ci) -

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

Lors de la création du rappel lui-même, vous utilisez getByteArray (int) ou l’un des autres getArrays.

byte[] myFunc(Pointer resuls, int numBytes)
{
     return Pointer.getByteArray(numBytes);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top