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
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
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 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
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
Recommended Posts