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?
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! –
@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
@ 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. –