Appeler un programme écrit en Swift depuis Processing (Java)

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

Générer une bibliothèque de liens dynamiques à partir de la source Swift

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 image.png

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$ 

Appelez en fait la fonction implémentée dans Swift du côté Java

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

  1. Importez des bibliothèques liées à JNA
  2. Définissez une interface qui hérite de com.sun.jna.Library (définition de la fonction créée à l'intérieur)
  3. Chargez la bibliothèque de liens dynamiques avec 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

image.png

Recommended Posts

Appeler un programme écrit en Swift depuis Processing (Java)
Appeler les fonctions du langage C depuis Swift
Appel de méthodes Java à partir de JavaScript exécutées en Java
J'ai créé un programme de jugement des nombres premiers en Java
GetInstance () à partir d'une classe @Singleton dans Groovy à partir de Java
Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai écrit un programme de factorisation prime en Java
Appeler Java depuis JRuby
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
Ecrire une classe en Kotlin et l'appeler en Java
Utilisation de la base de données (SQL Server 2014) à partir d'un programme Java 04/01/2018
Rechercher un sous-ensemble en Java
Programme Null-safe en Java (Eclipse)
Traitement parallèle mesuré avec Java
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
Implémentez l'interface Java dans la classe JRuby et appelez-la depuis Java
Obtenez facilement des entiers à partir des propriétés système en Java
Obtenir une collection non vide à partir d'un flux facultatif avec java
Chaîne d'appels depuis la chaîne dans l'intégration Spring
Appeler la classe scellée de Kotlin depuis Java
3 Implémentez un interpréteur simple en Java
J'ai créé un PDF avec Java.
Traitement de la date en Java (LocalDate: Initialization)
[Note] Ce que j'ai appris en six mois grâce à des inexpérimentés (Java)
[Note] Ce que j'ai appris en six mois grâce à des inexpérimentés (Java) (1)
Exécutez node.js depuis Android Java (traitement)
Accéder à Teradata depuis une application Java
Un exemple simple de rappels en Java
Créer un programme Servlet dans Eclipse
[Note] Ce que j'ai appris en six mois grâce à des inexpérimentés (Java) (3)
Faire un appel SOAP en C #
A propos du traitement de la copie de fichiers en Java
Restez coincé dans un Java Primer
Appelez l'API Java de TensorFlow depuis Scala
Ordre de traitement dans le programme
Appelez la super méthode en Java
Accéder à MySQL sur un conteneur Docker à partir d'un programme Java local (OS hôte)
Une histoire sur un projet Spring Boot écrit en Java qui prend en charge Kotlin
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
Lors de l'appel de println etc. à partir d'un fichier de classe Java externe en traitement
A propos du renvoi d'une référence dans un Java Getter
Étudiez le Deep Learning à partir de zéro en Java.
Qu'est-ce qu'une classe en langage Java (3 /?)
Traitement des données à l'aide de l'API de flux de Java 8
Appeler l'API GitHub à partir de l'API Socket de Java, partie 2
OCR en Java (reconnaissance de caractères à partir d'images)
Appelez l'API de notification Windows en Java
Inverser la clé de la valeur dans la carte Java
Un programme qui calcule la puissance de 2 à 100
Comment appeler le code Swift 5.3 depuis Objective-C
Java crée un graphique circulaire dans Excel
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Essayez d'exécuter Kubernetes Job à partir de Java
Pourquoi Java appelle-t-il un fichier une classe?
Créer une application TODO dans Java 7 Créer un en-tête
Un ingénieur Java a comparé Swift, Kotlin et Java.
Créons une application de calcul avec Java