2017-12-12 1 views
1

Ich muss eine DLL-Funktion von Java mit einem String-Array-Argument aufrufen. Der Argumentwert muss den gleichen Argumenten entsprechen, die über die Befehlszeile an das Java-Programm übergeben werden (Argument der Hauptmethode). Die Funktion hat folgende Signatur:JNA Char ** Argument

int calledFunction(char **args); 

Die wichtigste Methode Argument Typ ist String[] und entsprechend der JNA documentation, String[] sollte char ** direkt äquivalent sein.

Aber wenn ich das Argument von der Befehlszeile direkt an die DLL übergeben, stürzt das Programm ab oder die DLL interpretiert die Werte nicht richtig (die Werte sind nicht sinnvoll).

Irgendwelche Ideen?

JNA Interface Definition:

public interface TestDll extends Library { 

    int calledFunction(String[] param); 

} 

Verbrauch:

public static void main(String[] args) { 
    TestDll testDll = Native.loadLibrary("test_dll", TestDll.class); 
    testDll.calledFunction(args); 
} 
+0

haben Sie 'str.toCharArray()' versucht? – Tschallacka

+0

Und wie genau kennen Sie die Anzahl der Strings im Array? (argc) – manuell

+0

@Tschallacka was genau meinst du? Können Sie ein Codebeispiel angeben? – Jardo

Antwort

2

Sie sollten ein neues Array, größer (von 2) als args

String[] new_str_array = new String[ args.length + 2 ] // +1 for program name, +1 for null 
  • Eine regelmäßige C erstellen Funktion zur Verwaltung der Char ** Args eines MAI n Funktion, erwarte die erste Zeichenfolge als Programmname. am Anfang

    new_str_array[ 0 ] = "MyProgramExecutableName"; 
    

    Kopieren Sie dann die args auf das Java-Programm

  • Das Array von Zeigern muss durch einen zusätzlichen Null-Zeiger

Dann beendet werden, Sie Ihnen die Programmnamen übergeben setzen sollten

for (int i = 0; i < args.length; i++) { 
    new_str_array[ 1+i ] = args[ i ]; 
} 

rufen dann die C-Funktion mit new_str_array, die letzten string (bei Index args.length + 1) sollen wurden korrekt auf null (durch die new Anweisung)

+1

Das war genau das Problem! Die DLL erwartet, dass der erste Parameter der Name des Programms ist, und Java bringt es einfach nicht dort hin. Danke für die Antwort. Wie auch immer, die nachlaufende Null muss nicht da sein. JNA kümmert sich darum. – Jardo