Rufen Sie C-Sprachfunktionen von Swift aus auf

Ich habe versucht, eine C-Sprachfunktion von Swift aus aufzurufen.

Ich habe untersucht, wie Argumente beim Aufrufen einer C-Sprachfunktion von Swift übergeben werden. Bestätigt mit XCode 10.1.

Vorerst habe ich festgestellt, dass in Swift & kein Adressoperator ist. Manchmal ist es gut, den Typ zu erraten, aber im Fall einer selbst erstellten Struktur müssen Sie den Typ richtig konvertieren.

1 Kein Argument, kein Rückgabewert

c


void func1(void)
{
    return;
}

swift


func1()

Es ist einfach.

2 Argumente int, kein Rückgabewert

c


void func2(int a, int b)
{
    return;
}

swift


func2(1,2)

Das ist auch einfach, nicht wahr?

3 Argument int, Rückgabewert int

c


int func3(int a, int b)
{
    return a+b;
}

swift


//Drucken mit Drucken
print("func3()", func3(1,2))
//Variable zuweisen
let c = func3(7,8)
print("func3()", c)

Das ist auch einfach, nicht wahr?

4 Zeiger des Arrays des Arguments char

c


void func4(const char *in, char *out)
{
    unsigned long len = strlen(in) + 1;
    out[0] = 'A';
    memcpy(&out[1], in, len);
    return;
}

swift


var outstr : [CChar] = [0, 0, 0, 0, 0, 0]
func4("1234", &outstr)
print("func4()", outstr)
print("func4()", String(cString : outstr))

Wenn das Argument `const char *` lautet, wird es durch Übergeben eines String-Literal in eine C-Zeichenfolge konvertiert. Wenn das Argument `char *` ist, müssen Sie den Zeiger der Variablen übergeben.

Ausführungsbeispiel


func4() [65, 49, 50, 51, 52, 0]
func4() A1234

5 Argumentstruktur

c


struct location {
    int x;
    int y;
};

int func5(struct location loc);

c


int func5(struct location loc)
{
    loc.x += 1;
    loc.y += 1;
    return loc.x + loc.y;
}

swift


var l = location.init(x:1,y:2)
print("fnc5()", func5(l))

Sie können init () verwenden, um die Struktur zu initialisieren.

6 Argumentstrukturzeiger

h


struct location {
    int x;
    int y;
};

int func6(struct location *loc);

c


int func5(struct location loc)
{
    loc.x += 1;
    loc.y += 1;
    return loc.x + loc.y;
}

swift


var l = location.init(x:1,y:2)
withUnsafeMutablePointer(to: &l){
    let p = $0
    print("func6() before", p.pointee)
    func6(p)
    print("func6() after", p.pointee)
}

Verwenden Sie withUnsafeMutablePointer (), um den Zeiger der Struktur abzurufen. Der Typ von p ist UnsafeMutablePointer . Verwenden Sie p.pointee, um auf einen Strukturzeiger zu verweisen. Strukturzeiger sind nur im Hauptteil von withUnsafeMutablePointer () gültig.

7 Übergeben Sie den Datentyp als Zeiger und machen Sie den Ausgabezeiger zum Datentyp.

Angenommen, Sie haben eine in C geschriebene Encoderfunktion.

uint32_t hogeEnc(void *inp, void *outp);

Auf diese Weise ist eine nutzlose Kopie aufgetreten, die jedoch funktioniert hat.

    func encode(data:Data) -> Data {
        let input = UnsafeMutablePointer<UInt8>.allocate(capacity: 1920)
        let output = UnsafeMutablePointer<UInt8>.allocate(capacity: 1920)
        data.copyBytes(to: input, count: data.count)

        let enclen = hogeEnc(input, output)
        let encdata = Data(buffer: UnsafeMutableBufferPointer(start: output, count: Int(enclen)))
        
        input.deinitialize(count: 1920)
        output.deinitialize(count: 1920)

        return encdata
    }

Generieren Sie zunächst Zeiger für die Ein- und Ausgabe, um Speicherplatz zu sichern. Kopiert die Datentyp-Byte-Zeichenfolge des Arguments in den Bereich, auf den der Eingabezeiger zeigt. Rufen Sie die C-Codierungsfunktion auf. Konvertiert das von der Codierungsfunktion codierte Ergebnis in den Datentyp. Zu diesem Zeitpunkt wird der Typ UnsafeMutablePointer in den Typ UnsafeMutableBufferPointer konvertiert. Lassen Sie zum Schluss den Zeiger los. (Ich weiß nicht, ob es notwendig ist, aber nur für den Fall.) Achten Sie darauf, nicht außerhalb des in C-Sprache reservierten Bereichs zuzugreifen.

Das ist alles für jetzt.

Recommended Posts

Rufen Sie C-Sprachfunktionen von Swift aus auf
Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.
Machen Sie einen SOAP-Aufruf in C #
Rufen Sie die Java-Bibliothek von C mit JNI auf
[Swift] Ein Hinweis zu Funktion und Schließung
So rufen Sie Swift 5.3-Code von Objective-C auf
Konvertiert vom String-Zeiger der C-Sprache zum Swift-String-Typ
[Swift 5.3] Lernen Sie von einer Swift Tour Swift [Xcode 12.1] <10/28 im Aufbau>
ABC - 013-A & B & C.
Rufen Sie Java von JRuby aus auf
ABC - 036-A & B & C.
ABC - 010 - A & B & C.
ABC - 028 - A & B & C.
ABC - 015 - A & B & C.
ABC - 128 - A & B & C.
ABC - 012-A & B & C.
ABC - 018 - A & B & C.
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
ABC - 017 - A & B & C.
ABC - 029 - A & B & C.
ABC - 022 - A & B & C.
ABC - 019 - A & B & C.
ABC - 030 - A & B & C.
ABC - 127 - A & B & C.
ABC - 007 - A & B & C.
Behandeln Sie Swift-Funktionen und -Verschlüsse als Zeiger für C-Sprachfunktionen
ABC - 132 - A & B & C.
ABC - 026 - A & B & C.
ABC - 014 - A & B & C.
ABC - 016 - A & B & C.
ABC - 031 - A & B & C.
Generieren Sie Modelle von JSON zu Swift, PHP, C #, JAVA
ABC - 021 - A & B & C.
ABC - 025 - A & B & C.
ABC - 024 - A & B & C.
ABC - 027 - A & B & C.
ABC - 080 - A & B & C.
ABC - 129 - A & B & C & D.
ABC - 133 - A & B & C & D.
Verwenden Sie das C-Programm von Ruby
ABC - 122 - A & B & C & D.
ABC - 125 - A & B & C & D.
ABC - 130 - A & B & C & D.
ABC - 126 - A & B & C & D.
Informationen zum Hinzufügen einer ähnlichen Funktion
Übergeben Sie C-Sprache char * an Swift
Ich habe versucht, eine C-Sprachprogrammquelle aus cURL zu generieren
[Swift5] So kommunizieren Sie von ViewController zu Model und übergeben einen Wert