2017-05-17 2 views
0

In der Arbeit mit JNA hatte ich ein sehr seltsames Problem aufgetreten. Hier ist mein C++ Code. - Reduzierte der Einfachheit halber -Input Mismatch JNA

#include <iostream> 

extern "C" std::string func(int, int, int, double*, double*); 

std::string func(int a, int b, int c, double* data1, double* data2) { 
    std::cout << a << std::endl; 
    std::cout << b << std::endl; 
    std::cout << c << std::endl; 
    return "Finished"; 
} 

Hier ist die Java-Klasse:

class CLibOperator { 
    interface CLib extends Library { 
     CLib INSTANCE = 
      (CLib) Native.loadLibrary("libFile.so", CLib.class); 

     String func(int a, int b, int c, double[] data1, double[] data2); 
    } 

    public static void main(String[] args) { 
     double[] d1 = {10,20,30}; 
     double[] d2 = {111,222,333,444,555,666,777}; 
     CLib.INSTANCE.func(1, 2, 3, d1, d2); 
    } 
} 

Der Ausgang der C-Funktion ist jedoch:

2 
3 
3856103913 

Was ich erwartet ist:

1 
2 
3 

Es scheint wie das erste argumen t wird komplett ignoriert. Haben Sie irgendwelche Gedanken, wie Sie dieses Problem lösen können?

+0

Sie nicht primitive Arrays JNA passieren kann, so dass man für die Doppel Arrays einige Java-Seite Speicher zuweisen müssen, werden. Ich habe keine Ahnung, ob das etwas mit deinen Symptomen zu tun hat! –

+0

@DanielWiddis Warte, wirklich? [Ich habe es schon erfolgreich benutzt] (https://github.com/cxcorp/lacuna/blob/6028902c4e51dc8e42ceaca8e6e5a2cad90dda84/lacuna/lacuna-core/src/main/java/cx/corp/lacuna/core/windows/TokenOwnerNameFinder. Java # L77). – cubrr

+1

@ Cubrr Gah. Ich habe vermieden, das wegen seiner temporären/Umfangnatur zu verwenden, aber Sie haben Recht, es würde in diesem Fall gut funktionieren. –

Antwort

1

Sie versuchen, std::string von einer Funktion zurückzugeben, für die C-Verknüpfung angegeben wurde (extern "C"). Ich bin überrascht, dass Ihr Compiler sich nicht darüber beschwert. Beim Zurückgeben von Strukturen oder Klassen nach Wert ist es üblich, dass ein Compiler (natürlich abhängig von dem Compiler und der ABI) Code erzeugt, der im Wesentlichen der Struktur entspricht, die an den Aufrufer übergeben wird, wenn ein Zeiger an die Funktion als a übergeben wird Parameter.

Ändern Sie den Rückgabetyp auf const char *.

extern "C" const char *func(int, int, int, double *, double *); 

könnten Sie auch lesen interessieren: Functions with C linkage able to return class type?