Charles,
        That is good news. I do have a few comments/observations:

- Can you commit an eclipse .project with jna.jar as dependency?

- How would this affect existing use of JNA in a project that also uses JNA?
Will I be able depend on JRuby bundling JNA, or will JNA be wrapped under
the JRuby namespace and I will still need to provide my own jna.jar?

Peter

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf
Of Charles Oliver Nutter
Sent: Sunday, September 02, 2007 11:19 AM
To: [email protected]
Subject: [jruby-dev] I couldn't help myself: real POSIX functions through
JNA

I know, I know. It's got native code in it, and that's bad. It's using 
JNI, and that's bad. But dammit, for the life of me I couldn't see 
enough negatives to using Java Native Access that would outweigh the 
incredible positives. For example, the new POSIX interface I just committed:

import com.sun.jna.Library;
public interface POSIX extends Library {
   public int chmod(String filename, int mode);
   public int chown(String filename, int owner, int group);
}

Given this library, it takes a whopping *one line of code* to wire up 
the standard C library on a given platform:

import com.sun.jna.Native
POSIX posix = (POSIX)Native.loadLibrary("c", POSIX.class);

That's. It.

So the idea behind JNA (jna.dev.java.net) is to use a foreign function 
interface library (libffi in this case) to wire up C libraries 
programmatically. This allows loading a library, inspecting its 
contents, and providing interfaces for those functions at runtime. They 
get bound to the appropriate places in the interface implementation, and 
JNA does some magic under the covers to handle converting types around. 
And so far, it appears to do an outstanding job.

With this code in JRuby, we now have fully complete chmod and chown 
functionality. Before, we had to either shell out for chmod or use Java 
6 APIs that wouldn't allow setting executable bits, and we always had to 
shell out for chown because there's no Java API for it. Now, both work 
*flawlessly*.

The potential of this is enormous. Any C function we haven't been able 
to emulate, we can just use directly. Symlinks, fcntl, file stats and 
tests, process spawning and control, on and on and on. And how's this 
for a wild idea: with a bit of trickery, we could actually wire up Ruby 
C extensions, just by providing JNI/JRuby-aware implementations of the 
Ruby C API functions.

So there it is. I went ahead and committed a trunk build of JNA, and I'm 
working with the JNA guys to get a release out. We'll have to figure out 
the platform-specific bits, probably by just shipping a bunch of 
pre-built libraries (not a big deal; the JNI portion is about 26k), but 
the result will be true POSIX functionality in JRuby...the "last mile" 
of compatibility will largely be solved.

- Charlie

---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

Reply via email to