Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.

Wenn ich mit Processing Dienstprogramm-Software erstelle, komme ich nicht an den juckenden Ort (Systemumgebungs-Einstellsystem usw.).

Wenn Sie es mit Swift implementieren, fällt es Ihnen nicht schwer, die API zu erreichen. Ich denke, es ist anders, "Runtime # exec" oder "ProcessBuilder" auf der Java-Seite zu verwenden. Irgendwie möchte ich eine in Swift implementierte Funktion wie eine in Java implementierte Methode treffen!

JNA(Java Native Access) Da die Substanz der Verarbeitung eine Java-Klasse ist, die die PApplet-Klasse erbt, Java-Grammatik und Assets können verwendet werden

Java verfügt über einen Mechanismus namens JNI (Java Native Interface), der mit in C / C ++ implementiertem nativem Code verknüpft ist. Ich denke, wenn Sie diese JNI verwenden, können Sie den in Swift implementierten nativen Code aufrufen. Es ist wirklich unmöglich, eine JNI zu schreiben, die Java und C / C ++ verbindet (Erstellen Sie eine Funktion mit einem Funktionsnamen einschließlich des Paketnamens ...)

Ah, ** Ich möchte nativen Code von Java aus aufrufen ** Aber ** ich möchte kein JNI schreiben **

Verwenden Sie in diesem Fall ** JNA (Java Native Access) ** Es scheint, dass er etwas Gutes tun wird!

Informationen zu JNA finden Sie in diesem Bereich. https://qiita.com/everylittle/items/b888cbec643f14de5ea6

Generieren Sie eine dynamische Linkbibliothek aus der Swift-Quelle

Erstellen Sie die Methode, die Sie von Java aus aufrufen möchten, sowohl im Kaninchen als auch in der Ecke

hello.swift


import Darwin.C

@_cdecl("hello")
public func hello() {
    print("Hello")
    fflush(stdout)
}

Das obige Programm implementiert eine Funktion, die in der Standardausgabe "Hallo" anzeigt Der Punkt ist ** 1. Legen Sie die Aufrufkonvention fest **, ** 2. Machen Sie sie öffentlich **

Es scheint, dass es nicht ohne "fflush (stdout)" gedruckt wird, also lasst es uns einfügen Printf from native code appears only at the end of the java app https://stackoverrun.com/ja/q/3379588

So wie es ist, ist es immer noch die Quelle, also lasst es uns kompilieren. Generieren Sie eine dynamische Linkbibliothek (lib * .dylib unter MacOS) aus dem oben genannten Programm

Generieren Sie eine dynamische Linkbibliothek


swiftc -emit-library hello.swift

Wenn Sie den obigen Befehl im Terminal ausführen, wird "lib + Dateiname (ohne Erweiterung) + .dylib" angezeigt Dynamische Linkbibliothek wird generiert image.png

Wenn Sie mit dem Befehl nm nachsehen, scheint sich die Funktion "Hallo" im globalen Bereich zu befinden, und Sie können sie so nennen.

Bestätigen Sie mit dem Befehl nm


cha84rakanal$ nm libhello.dylib 
0000000000000e40 T _$S5helloAAyyF
                 U _$S6Darwin6stdoutSpySo7__sFILEVGvg
                 U _$SSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC
                 U _$SSSN
                 U _$Ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5
                 U _$Ss5print_9separator10terminatoryypd_S2StF
                 U _$Ss5print_9separator10terminatoryypd_S2StFfA0_
                 U _$Ss5print_9separator10terminatoryypd_S2StFfA1_
0000000000000fac s ___swift_reflection_version
                 U __swift_FORCE_LOAD_$_swiftDarwin
0000000000001060 s __swift_FORCE_LOAD_$_swiftDarwin_$_hello
                 U _fflush
0000000000000e30 T _hello
                 U _swift_bridgeObjectRelease
                 U _swift_bridgeObjectRetain
                 U dyld_stub_binder
cha84rakanal$ 

Rufen Sie die in Swift implementierte Funktion tatsächlich von der Java-Seite aus auf

Rufen wir nun die zuvor von der Verarbeitungsseite (Java) erstellte "Hallo-Funktion" auf. Legen Sie die dynamisch generierte dynamische Linkbibliothek in das Datenverzeichnis der Skizze und verschieben Sie sie mit der nächsten Skizze!

JNAProcessing.pde


import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public interface SwiftLib extends Library {
    void hello();
}

SwiftLib mylib;

void setup(){
    mylib = (SwiftLib) Native.loadLibrary(dataPath("libhello.dylib"), SwiftLib.class);
    mylib.hello();
}

void draw(){
}

Der Punkt ist

  1. Importieren Sie JNA-bezogene Bibliotheken
  2. Definieren Sie eine Schnittstelle, die com.sun.jna.Library erbt (Definition der darin erstellten Funktion).
  3. Laden Sie die dynamische Linkbibliothek mit "Native # loadLibrary". Wenn Sie nur den Bibliotheksnamen verwenden, wechseln Sie zum Pfad der dynamischen Bibliothek, auf die Java verweist, und geben Sie ihn mit einem absoluten Pfad ein.

Wenn Hallo angezeigt wird, ist es OK! Alles was Sie tun müssen, ist mit Swift zu implementieren, was Sie wollen! Na dann, gutes Verarbeitungsleben

image.png

Recommended Posts

Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.
Rufen Sie C-Sprachfunktionen von Swift aus auf
Rufen Sie Java-Methoden aus JavaScript auf, das in Java ausgeführt wird
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
GetInstance () aus einer @ Singleton-Klasse in Groovy aus Java
Java-Methodenaufruf von RPG (Methodenaufruf in eigener Klasse)
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
Rufen Sie Java von JRuby aus auf
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
Verwenden der Datenbank (SQL Server 2014) aus einem Java-Programm 2018/01/04
Suchen Sie eine Teilmenge in Java
Nullsicheres Programm in Java (Eclipse)
Gemessene Parallelverarbeitung mit Java
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Implementieren Sie die Java-Schnittstelle in der JRuby-Klasse und rufen Sie sie von Java aus auf
Holen Sie sich ganz einfach Ganzzahlen aus den Systemeigenschaften in Java
Holen Sie sich mit Java eine nicht leere Sammlung aus einem optionalen Stream
Rufen Sie Chain from Chain in Spring Integration auf
Rufen Sie Kotlins versiegelte Klasse von Java aus an
3 Implementieren Sie einen einfachen Interpreter in Java
Ich habe ein PDF mit Java erstellt.
Datumsverarbeitung in Java (LocalDate: Initialisierung)
[Anmerkung] Was ich in einem halben Jahr von unerfahrenen (Java) gelernt habe
[Anmerkung] Was ich in einem halben Jahr von unerfahrenen (Java) gelernt habe (1)
Führen Sie node.js von Android Java aus (Verarbeitung)
Greifen Sie über eine Java-Anwendung auf Teradata zu
Ein einfaches Beispiel für Rückrufe in Java
Erstellen Sie ein Servlet-Programm in Eclipse
[Anmerkung] Was ich in einem halben Jahr von unerfahrenen (Java) gelernt habe (3)
Machen Sie einen SOAP-Aufruf in C #
Informationen zur Dateikopierverarbeitung in Java
Bleiben Sie in einem Java Primer stecken
Rufen Sie die Java-API von TensorFlow von Scala aus auf
Reihenfolge der Verarbeitung im Programm
Rufen Sie die Super-Methode in Java auf
Greifen Sie über ein lokales Java-Programm (Host-Betriebssystem) auf MySQL in einem Docker-Container zu
Eine Geschichte über ein in Java geschriebenes Spring Boot-Projekt, das Kotlin unterstützt
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
Beim Aufrufen von println usw. aus einer externen Java-Klassendatei in Processing
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Lernen Sie Deep Learning von Grund auf in Java.
Was ist eine Klasse in der Java-Sprache (3 /?)
Datenverarbeitung mit der Stream-API von Java 8
Rufen Sie die GitHub-API über Javas Socket-API Teil2 auf
OCR in Java (Zeichenerkennung aus Bildern)
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Schlüssel vom Wert in Java Map umkehren
Ein Programm, das die Leistung von 2 bis 100 berechnet
So rufen Sie Swift 5.3-Code von Objective-C auf
Java erstellt ein Kreisdiagramm in Excel
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist eine Klasse in der Java-Sprache (2 /?)
Versuchen Sie, Kubernetes Job von Java aus auszuführen
Warum nennt Java eine Datei eine Klasse?
Erstellen Sie eine TODO-App in Java 7 Create Header
Ein Java-Ingenieur verglich Swift, Kotlin und Java.
Lassen Sie uns eine Taschenrechner-App mit Java erstellen