2010-01-23 25 views
2

Dans Narwhal, nous utilisons JNA pour faire libc appels comme getcwd et chdir. Je n'ai été capable de l'utiliser qu'avec ma connaissance limitée de l'interface JNA en ce qui concerne JavaScript dans Rhino, traitant exclusivement des primitives. J'ai besoin de savoir comment allouer un tampon char afin que je puisse le passer à getcwd, récupérer une chaîne JavaScript à partir de ce tampon, et libérer le tampon, vraisemblablement dans une clause finally.Allocation d'un tampon char avec JNA, Rhino, JavaScript

Voilà comment nous saisissons l'interface libc:

http://github.com/280north/narwhal/blob/34ac15261fa4acdef3867256e97d7aabb94766e0/engines/rhino/lib/fs-base.js#L32-42

Voilà comment chdir est mis en œuvre:

http://github.com/280north/narwhal/blob/34ac15261fa4acdef3867256e97d7aabb94766e0/engines/rhino/lib/fs-base.js#L438-444

est ici où nous avons besoin de la solution pour getcwd

http://github.com/280north/narwhal/blob/34ac15261fa4acdef3867256e97d7aabb94766e0/engines/rhino/lib/fs-base.js#L416-419

Des solutions en Ruby ou tout autre langage incorporé pour JNA aideraient.

+0

J'ai un indice de @ binary42 concernant JRuby http://github.com/jruby/jruby/blob/master/src/org/jruby/RubyDir.java#L374 toujours en train d'analyser. –

Répondre

1

vous pouvez utiliser une nio.Buffer ou jna.Pointer pour passer un tampon de sortie, quelque chose comme:

invokeString(new jna.Memory(4097), 4097) 

getcwd retournera un char * dans la mémoire tampon d'entrée, donc jna va marshall le retour à une chaîne

pour soutenir des chemins plus longs, vous pouvez prendre une longueur en option

en java, new File (""). getAbsolutePath() peut obtenir le chemin en cours, de sorte que vous ne pourriez pas besoin getcwd ...

+0

Solution: http://github.com/kriskowal/narwhal/blob/3d6a7cd99c086340f695255057e93e877ed482d1/engines/rhino/lib/fs-base.js#L477-486 –