Ce document, qui s'adresse aux utilisateurs de Scilab, montre comment utiliser les fonctionnalités de Scilab à partir d'une application Java. Des exemples de programmes ainsi que les classes nécessaires se trouvent sur le site Web du cours à l'adresse :
L'interface Java/Scilab repose sur la classe Matrix du paquet javasci et sur une bibliothèque native libjavasci.so. Elle permet de transmettre des instructions à Scilab et d'échanger des données entre Java et Scilab ; ces données sont des matrices pleines.
Il faut dire où se trouve la bibliothèque libjavasci.so, en exécutant la commande suivante :
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/usr/local/eleves/scilab-2.6-lib
Le type javasci.Matrix a deux constructeurs :
Par exemple,
Matrix a = new Matrix("A", 4, 4); Matrix b = new Matrix("B", 2, 2, new double[] {1,2,3,4});
Le nom, le nombre de colonnes et le nombre de lignes d'une instance de Matrix sont obtenues respectivement par les méthodes getName(), getCol() et getRow(). La méthode getData() retourne un tableau unidimensionnel de double qui contient les éléments de la matrice, rangés par colonnes successives (à la Fortran).
Les communications entre Java et Scilab sont réalisées par les méthodes scilabSend() et scilabGet() :
La fonction scilabExec(String job) a pour effet d'exécuter la commande Scilab passée en argument ; cela suppose que les noms figurant dans cette commmande sont déjà connus de Scilab :
scilabExec("A=rand(2,2)"); Matrix b = new Matrix("B", 2, 2, new double[] {1,2,3,4}); b.scilabSend(); scilabExec("C=A*B"); Matrix c = new Matrix("C", 2, 2); c.scilabGet();
La méthode scilabJob(String job) combine les précédentes : l'évaluation de a.scilabJob(job) a le même effet que a.scilabSend(); scilabExec(job); a.scilabGet();.
Comme premier exemple, supposons qu'une application Java doive déléguer à Scilab la contruction d'une matrice 261#261 à éléments aléatoires puis le calcul de son inverse, ce qui se ferait directement en Scilab par les commandes suivantes :
-->A = rand(4,4) A = ! 0.2113249 0.6653811 0.8782165 0.7263507 ! ! 0.7560439 0.6283918 0.0683740 0.1985144 ! ! 0.0002211 0.8497452 0.5608486 0.5442573 ! ! 0.3303271 0.6857310 0.6623569 0.2320748 ! -->A = inv(A) A = ! 0.7883394 1.0593819 - 1.4808293 0.0992730 ! ! - 1.608747 0.2048732 1.8338801 0.5590506 ! ! 0.6141762 - 0.9831996 - 1.253414 1.8582445 ! ! 1.8785065 0.6928741 0.2663668 - 2.787774 !
Le programme Java correspondant est :
import javasci.Matrix; class JavaSciTest { public static void main(String[] args) { scilabExec("A = rand(4,4)"); scilabExec("disp(A)"); scilabExec("A = inv(A)"); scilabExec("disp(A)"); } }
Pour exécuter cette application Java, il faut compiler ce programme de manière habituelle ; l'exécution de l'application JavaSciTest a pour résultat :
ekdahl% java JavaSciTest Et Hop .... Startup execution: loading initial environment Fin de Init ! 0.2113249 0.6653811 0.8782165 0.7263507 ! ! 0.7560439 0.6283918 0.0683740 0.1985144 ! ! 0.0002211 0.8497452 0.5608486 0.5442573 ! ! 0.3303271 0.6857310 0.6623569 0.2320748 ! ! 0.7883394 1.0593819 - 1.4808293 0.0992730 ! ! - 1.608747 0.2048732 1.8338801 0.5590506 ! ! 0.6141762 - 0.9831996 - 1.253414 1.8582445 ! ! 1.8785065 0.6928741 0.2663668 - 2.787774 !
Pour éviter des erreurs dans le passage du nom et des dimensions, il est préférable d'écrire les invocations précédentes de scilabExec de la façon suivante :
a.scilabExec(a.getName() + " = rand(" + a.getCol() +"," + a.getRow() +");"); a.scilabExec("disp(" + a.getName() +");"); a.scilabExec(a.getName() + " = inv(" + a.getName() +");"); a.scilabExec("disp(" + a.getName() +");");