7
votes

Renvoyer C Array à Java en utilisant la JNA

Je ne suis pas trop familier avec c, mais je dois utiliser une bibliothèque C dans mon code Java. J'ai créé la DLL et je suis capable d'y accéder, mais je tente de renvoyer une gamme d'INT du code C au code Java.

en CI pensait que vous pourriez simplement retourner un pointeur sur le tableau, mais Cela ne fonctionne pas comme si j'attends dans mon code Java. Voici le code C: p> xxx pré>

si je testez ceci en C ++ en faisant p> xxx pré>

alors ça marche bien et je reçois Les valeurs 739, 255 comme prévu. P>

J'essaye d'utiliser en Java avec le paquet JNA comme (mais cela me donne 739, -16777214): P>

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


0 commentaires

3 Réponses :


6
votes

Le code C est bien devrait être meilleur (voir les autres commentaires), cependant, le problème principal est que je faisais une mauvaise utilisation de la méthode Java getint () pour le pointeur . Il semble que j'aurais dû utiliser le getintarray () .


0 commentaires

4
votes

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

lors de la création du rappel lui-même, vous utilisez getbyteArray (int ), ou l'un des autres getards. xxx


0 commentaires

4
votes

Je n'utiliserais pas une telle fonction, car le tableau renvoyé ne sera jamais libéré / supprimé. Je préférerais changer la fonction c si je peux pour:

void myfunc (pointer Resuls, int Numbytes, octet const * retournerrarare)


0 commentaires