Lorsque je crée un logiciel utilitaire en utilisant Processing, je ne peux pas accéder à l'endroit qui démange (système de configuration de l'environnement système, etc.)
Si vous l'implémentez avec Swift, vous n'aurez pas de mal à accéder à l'API,
Je pense que c'est différent d'utiliser Runtime # exec
ou ProcessBuilder
du côté Java.
D'une manière ou d'une autre, je veux toucher une fonction implémentée dans Swift comme une méthode implémentée en Java!
JNA(Java Native Access) Étant donné que la substance de Processing est une classe Java qui hérite de la classe PApplet, La grammaire et les ressources Java peuvent être utilisées
Java a un mécanisme appelé JNI (Java Native Interface) qui est lié au code natif implémenté en C / C ++. Je pense que si vous utilisez ce JNI, vous pouvez appeler le code natif implémenté dans Swift, Il est vraiment impossible d'écrire un JNI qui connecte Java et C / C ++ (Créez une fonction avec un nom de fonction incluant le nom du package ...)
Ah, ** je veux appeler du code natif depuis Java ** Mais ** je ne veux pas écrire JNI **
Dans ce cas, utilisez ** JNA (Java Native Access) ** Il semble qu'il fera quelque chose de bien!
Pour JNA, reportez-vous à cette zone. https://qiita.com/everylittle/items/b888cbec643f14de5ea6
Créez la méthode que vous souhaitez appeler depuis Java, à la fois dans le lapin et dans le coin
hello.swift
import Darwin.C
@_cdecl("hello")
public func hello() {
print("Hello")
fflush(stdout)
}
Le programme ci-dessus implémente une fonction qui affiche Hello
dans la sortie standard
Le point est ** 1. Définissez la convention d'appel **, ** 2. Rendez-le public **
Il semble qu'il ne sera pas imprimé sans fflush (stdout)
, alors mettons-le dans
Printf from native code appears only at the end of the java app
https://stackoverrun.com/ja/q/3379588
En l'état, c'est toujours la source, alors compilons-la. Générez une bibliothèque de liens dynamiques (lib * .dylib sur MacOS) à partir du programme ci-dessus
Générer une bibliothèque de liens dynamiques
swiftc -emit-library hello.swift
Lorsque vous exécutez la commande ci-dessus dans le terminal, vous verrez lib + nom de fichier (sans extension) + .dylib
La bibliothèque de liens dynamiques est générée
Si vous vérifiez avec la commande nm, il semble que la fonction hello
soit dans la section globale et vous pouvez l'appeler quelque chose.
Confirmer avec la commande 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$
Maintenant, appelons en fait la fonction Hello
créée précédemment du côté Traitement (Java).
Placez la bibliothèque de liens dynamiques générée dynamiquement dans le répertoire de données de l'esquisse et déplacez-la avec l'esquisse suivante!
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(){
}
Le point est
Native # loadLibrary
, et si vous n'utilisez que le nom de la bibliothèque, accédez au chemin de la bibliothèque dynamique référencée par Java, et assurez-vous de le saisir avec un chemin absolu.Si Hello est affiché, c'est OK! Tout ce que vous avez à faire est de mettre en œuvre ce que vous voulez avec Swift! Eh bien, bonne durée de vie
Recommended Posts