{"id":1105,"date":"2006-09-05T03:01:00","date_gmt":"2006-09-05T10:01:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=1105"},"modified":"2006-09-05T03:01:00","modified_gmt":"2006-09-05T10:01:00","slug":"como-obtener-el-unix-uid-desde-java-jugando-con-jni","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2006\/09\/05\/como-obtener-el-unix-uid-desde-java-jugando-con-jni\/","title":{"rendered":"Como obtener el UNIX UID desde Java: Jugando con JNI"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/photos22.flickr.com\/34053236_67aaafd43f_m.jpg\" alt=\"Java\" style=\"border: 0pt none ;\" border=\"0\" \/><\/p>\n<p>Este es uno de esos experimientos que sale por la necesidad, ya que recientemente alguien en mi compa\u00f1ia me pregunt\u00f3 como hacer algo parecido y le dije que <a href=\"http:\/\/java.sun.com\/j2se\/1.4.2\/docs\/guide\/jni\/\">usando JNI.<\/a> Sin embargo cuando me pregunt\u00f3 si alguna vez lo hab\u00eda hecho y respond\u00ed que no, y no qued\u00f3 muy impresionado.<\/p>\n<p>As\u00ed que me decid\u00ed a tomar cartas en el asunto, y decid\u00ed escribir un peque\u00f1o programa que obtiene el UNIX PID y el PPID de un programa en Java, para ver como es el asunto. Como ustedes recordar\u00e1n, el <span style=\"font-style: italic;\">PID (Program Id) <\/span>de un programa en UNIX no es m\u00e1s que un identificador \u00fanico que una aplicaci\u00f3n tiene en la tabla de procesos del sistema operativo cuando es ejecutada. <span style=\"font-style: italic;\">El Parent Program Id no es m\u00e1s que el PID<\/span> del programa que llam\u00f3 a la aplicaci\u00f3n actual.<\/p>\n<p>Java no sabe nada de eso ya que es una caracteristica propia del sistema operativo en donde corre el programa, por lo cual usamos un poco de JNI para obtener el valor.<\/p>\n<p>Para m\u00e1s detalles de como funciona la llamada nativa, solamente hagan lo siguiente:<br \/><span style=\"font-weight: bold;\"><\/p>\n<blockquote><p>[josevnz@localhost test]$ man getpid<\/p><\/blockquote>\n<p><\/span>Existen muy buenos tutoriales en la red, entre ellos <a href=\"http:\/\/java.sun.com\/docs\/books\/jni\/html\/jniTOC.html\">un libro completo<\/a> y otro procedimiento que detalla pasos especificos con <a href=\"http:\/\/java.sun.com\/developer\/onlineTraining\/Programming\/JDCBook\/jniexamp.html\">el sistema operativo Linux<\/a>. Mi intenci\u00f3n no es escribir un tutorial sino mostrarles algunas piezas de c\u00f3digo que considero interesantes.<\/p>\n<p>Terminado este preambulo, vamos a escribir el c\u00f3digo; lo primero es declarar una clase en Java la cual define dos m\u00e9todos nativos, los cuales tendr\u00e1n una implementaci\u00f3n en C:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">package<\/span> com.kodegeek.blog.unix;<br \/><span class=\"gutter\">   2:<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Native<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">access<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">pid<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">and<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">ppid<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">process<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">information<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">under<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">UNIX<\/span><span class=\"syntax3\">.<\/span><br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@author<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">josevnz<\/span><br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@version<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">0<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">1<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">09<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">04<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">2006<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">   8:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax8\">final<\/span> <span class=\"syntax10\">class<\/span> UnixPid <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">   9:<\/span><br \/><span class=\"gutterH\">  10:<\/span>        <span class=\"syntax8\">static<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  11:<\/span>                System.<span class=\"syntax6\">loadLibrary<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">unix<\/span><span class=\"syntax13\">\"<\/span>);     <br \/><span class=\"gutter\">  12:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  13:<\/span><br \/><span class=\"gutter\">  14:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">constructor<\/span><br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  17:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax6\">UnixPid<\/span>() <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  18:<\/span>                <span class=\"syntax14\">super<\/span>();<br \/><span class=\"gutter\">  19:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  20:<\/span><br \/><span class=\"gutter\">  21:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">  22:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Get<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">program<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">UNIX<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">id<\/span><br \/><span class=\"gutter\">  23:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@return<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">int<\/span><br \/><span class=\"gutter\">  24:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutterH\">  25:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">native<\/span> <span class=\"syntax10\">int<\/span> <span class=\"syntax6\">getPid<\/span>();<br \/><span class=\"gutter\">  26:<\/span><br \/><span class=\"gutter\">  27:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">  28:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">get<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">program<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">parent<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">id<\/span><br \/><span class=\"gutter\">  29:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@return<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">int<\/span><br \/><span class=\"gutterH\">  30:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  31:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">native<\/span> <span class=\"syntax10\">int<\/span> <span class=\"syntax6\">getPpId<\/span>();<br \/><span class=\"gutter\">  32:<\/span><br \/><span class=\"gutter\">  33:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">  34:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Run<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">from<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">command<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">line<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Test<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">case<\/span><br \/><span class=\"gutterH\">  35:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">args<\/span><br \/><span class=\"gutter\">  36:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@throws<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Exception<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">If<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">thread<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">is<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">interrupted<\/span><br \/><span class=\"gutter\">  37:<\/span><span class=\"syntax3\">        <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  38:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">main<\/span>(String[] args) <span class=\"syntax8\">throws<\/span> Exception <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  39:<\/span>                UnixPid instance <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">UnixPid<\/span>();<br \/><span class=\"gutterH\">  40:<\/span>                System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">PID:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> instance.<span class=\"syntax6\">getPid<\/span>());<br \/><span class=\"gutter\">  41:<\/span>                System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">PPID:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">+<\/span> instance.<span class=\"syntax6\">getPpId<\/span>());<br \/><span class=\"gutter\">  42:<\/span>                Thread.<span class=\"syntax6\">sleep<\/span>(<span class=\"syntax5\">300<\/span>);<br \/><span class=\"gutter\">  43:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  44:<\/span><span class=\"syntax18\">}<\/span><br \/><\/pre>\n<p>Nada complicado, cargamos la librer\u00eda compartida (Linea 11, .so) en una declaraci\u00f3n est\u00e1tica para garantizar que esta lista antes que cualquiera de los m\u00e9todos sea llamado. Los m\u00e9todos nativos (lineas 25 y 31) se declaran aqui.<\/p>\n<p>Despu\u00e9s vienen un par de pasos m\u00e1s o menos automaticos:<\/p>\n<ul>\n<li>Compilar el c\u00f3digo en Java<\/li>\n<li>Crear el archivo .h de nuestra librer\u00eda, usando javah en base al c\u00f3digo compilado de Java<\/li>\n<li>Implementar los m\u00e9todos en C<\/li>\n<li>Compilar el c\u00f3digo en C, creando una librer\u00eda compartida<\/li>\n<li>Poner la librer\u00eda en la ruta del LD_LIBRARY_PATH<\/li>\n<li>Correr el programa y celebrar<\/li>\n<\/ul>\n<p> Dado que soy muy perezoso, me decid\u00ed a escribir una tarea en Ant que hace todo el trabajo. Les coloco el archivo con s\u00f3lo los pedazos importantes:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax10\">&lt;?<\/span><span class=\"syntax10\">xml<\/span><span class=\"syntax10\"> <\/span><span class=\"syntax10\">version=\"1.0\"<\/span><span class=\"syntax10\"> <\/span><span class=\"syntax10\">encoding=\"ISO-8859-1\"?<\/span><span class=\"syntax10\">&gt;<\/span><br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">project<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Unix<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">default<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">build<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">basedir<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">   6:<\/span>        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">description<\/span><span class=\"syntax17\">&gt;<\/span>Access to native facilities using Java and<br \/>JNI<span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">description<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">   7:<\/span>        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">property<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">description<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Global<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">properties<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">file<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">build.properties<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">   8:<\/span> <br \/><span class=\"gutter\">   9:<\/span>        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">property<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">description<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Load<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">any<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">environment<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">variables<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">into<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">Ant<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"><br \/><\/span><span class=\"syntax17\">environment<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">env<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\">  10:.......<\/span><span class=\"syntax17\"><\/span><br \/><span class=\"gutter\">  48:<\/span> <br \/><span class=\"gutter\">  49:<\/span>        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">target<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutterH\">  50:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">build<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  51:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">depends<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">init<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  52:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">description<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Compile<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">Java<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">and<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">native<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">source<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">code<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  53:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">javac<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  54:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">srcdir<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${src.java}\/main<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutterH\">  55:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">destdir<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${build}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  56:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">deprecation<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">true<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  57:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">optimize<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">false<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  58:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">debug<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">true<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  59:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">include<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">com\/kodegeek\/blog\/unix\/**\/*.java<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\">  60:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">classpath<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">refid<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">path.classpath<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  61:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">javac<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  62:<\/span><br \/><span class=\"gutter\">  63:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">copy<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  64:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">todir<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${build}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">overwrite<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">true<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\">  65:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">fileset<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">dir<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${properties}\/main<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  66:<\/span>                                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">include<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\"><br \/>name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">com\/kodegeek\/blog\/unix\/**\/*.properties<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  67:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">fileset<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  68:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">copy<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  69:<\/span>                         <br \/><span class=\"gutterH\">  70:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">javah<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\">  71:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">class<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">com.kodegeek.blog.unix.UnixPid<\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\">  72:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">force<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">yes<\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\">  73:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">outputfile<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${build}\/include\/UnixPid.h<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  74:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">classpath<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">refid<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">path.classpath<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\">  75:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">javah<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  76:<\/span>         <br \/><span class=\"gutter\">  77:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">exec<\/span><br \/><span class=\"gutter\">  78:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">executable<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">make<\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\">  79:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">failonerror<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">true<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\">  80:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">-f<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  81:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">file<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Makefile<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  82:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">INCLUDES=${native.include}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  83:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">JAVA_HOME=${java.home}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  84:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">SHARED_UNIX=${native.shared}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\">  85:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">SRC=${src.cpp}\/${ant.project.name}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  86:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">DIST=${dist}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  87:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">arg<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">all<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  88:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">exec<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  89:<\/span>         <br \/><span class=\"gutterH\">  90:<\/span>        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">target<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\">  91:<\/span> <br \/><span class=\"gutter\">  92:<\/span> ....<br \/><span class=\"syntax17\"><\/span><span class=\"gutterH\"> 110:<\/span> <br \/><span class=\"gutter\"> 111:<\/span>        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">target<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\"> 112:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">jar<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\"> 113:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">depends<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">build<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\"> 114:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">description<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Pack<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">project<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">sources<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">for<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">distribution<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\"> 115:<\/span>         <br \/><span class=\"gutter\"> 116:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">manifest<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">file<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${jar.file.manifest}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 117:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">section<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${ant.project.name}\/<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 118:<\/span>                                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">attribute<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Built-By<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${user.name}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 119:<\/span>                                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">attribute<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Sealed<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">true<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\"> 120:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">section<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 121:<\/span>                        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">attribute<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">name<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Main-Class<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\"><br \/>value<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">com.kodegeek.blog.unix.UnixPid<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 122:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">manifest<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 123:<\/span>         <br \/><span class=\"gutter\"> 124:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">jar<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutterH\"> 125:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">jarfile<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${jar.file}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\"> 126:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">basedir<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${build}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><br \/><span class=\"gutter\"> 127:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">description<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">build<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">jar<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">file<\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\"> 128:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">excludes<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">**\/include\/**<\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\"> 129:<\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">        <\/span><span class=\"syntax17\">manifest<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${jar.file.manifest}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutterH\"> 130:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">jar<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 131:<\/span>         <br \/><span class=\"gutter\"> 132:<\/span>                <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">delete<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">file<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">${jar.file.manifest}<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\"> <\/span><span class=\"syntax17\">quiet<\/span><span class=\"syntax17\">=<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax13\">true<\/span><span class=\"syntax13\">\"<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 133:<\/span>        <span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">target<\/span><span class=\"syntax17\">&gt;<\/span><br \/><span class=\"gutter\"> 134:<\/span> <br \/><span class=\"gutterH\"> 135:<\/span>...<span class=\"syntax17\"><\/span><br \/><span class=\"gutter\"> 174:<\/span> <br \/><span class=\"gutterH\"> 175:<\/span><span class=\"syntax17\">&lt;<\/span><span class=\"syntax17\">\/<\/span><span class=\"syntax17\">project<\/span><span class=\"syntax17\">&gt;<\/span><br \/><\/pre>\n<p>Cuando generamos los encabezados en C (UnixPid.h), obtenemos algo como esto, a partir de la clase de Java:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax1\">\/*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">DO<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">NOT<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">EDIT<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">THIS<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">FILE<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">-<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">it<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">is<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">machine<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">generated<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*\/<\/span><br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">include<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">&lt;jni.h&gt;<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax1\">\/*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Header<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">for<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">class<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">com_kodegeek_blog_unix_UnixPid<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*\/<\/span><br \/><span class=\"gutter\">   4:<\/span><br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">ifndef<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">_Included_com_kodegeek_blog_unix_UnixPid<\/span><br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">define<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">_Included_com_kodegeek_blog_unix_UnixPid<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">ifdef<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">__cplusplus<\/span><br \/><span class=\"gutter\">   8:<\/span><span class=\"syntax8\">extern<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">C<\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">endif<\/span><br \/><span class=\"gutterH\">  10:<\/span><span class=\"syntax1\">\/*<\/span><br \/><span class=\"gutter\">  11:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Class:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">com_kodegeek_blog_unix_UnixPid<\/span><br \/><span class=\"gutter\">  12:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Method:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">getPid<\/span><br \/><span class=\"gutter\">  13:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Signature:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">()I<\/span><br \/><span class=\"gutter\">  14:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*\/<\/span><br \/><span class=\"gutterH\">  15:<\/span>JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPid<br \/><span class=\"gutter\">  16:<\/span>  (JNIEnv <span class=\"syntax18\">*<\/span>, jobject);<br \/><span class=\"gutter\">  17:<\/span><br \/><span class=\"gutter\">  18:<\/span><span class=\"syntax1\">\/*<\/span><br \/><span class=\"gutter\">  19:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Class:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">com_kodegeek_blog_unix_UnixPid<\/span><br \/><span class=\"gutterH\">  20:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Method:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">getPpId<\/span><br \/><span class=\"gutter\">  21:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Signature:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">()I<\/span><br \/><span class=\"gutter\">  22:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*\/<\/span><br \/><span class=\"gutter\">  23:<\/span>JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPpId<br \/><span class=\"gutter\">  24:<\/span>  (JNIEnv <span class=\"syntax18\">*<\/span>, jobject);<br \/><span class=\"gutterH\">  25:<\/span><br \/><span class=\"gutter\">  26:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">ifdef<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">__cplusplus<\/span><br \/><span class=\"gutter\">  27:<\/span><span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  28:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">endif<\/span><br \/><span class=\"gutter\">  29:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">endif<\/span><br \/><\/pre>\n<p>Sin embargo <span style=\"font-style: italic;\">la parte realmente interesante<\/span> es la conexi\u00f3n del c\u00f3digo nativo con Java. Eso lo hacemos en el archivo .C en donde vamos a implementar las declaraciones de los metodos nativos (copiados del archivo UnixPid.h):<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">include<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">&lt;jni.h&gt;<\/span><br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">include<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">&lt;unistd.h&gt;<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">include<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">&lt;sys\/types.h&gt;<\/span><br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax9\">#<\/span><span class=\"syntax17\">include<\/span><span class=\"syntax9\"> <\/span><span class=\"syntax9\">\"UnixPid.h\"<\/span><br \/><span class=\"gutterH\">   5:<\/span><br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Provides<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">native<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">access<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">PID<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">access<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">current<\/span><br \/><span class=\"gutter\">   8:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Java<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">process<\/span><span class=\"syntax3\">.<\/span><br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">man<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">getpid,<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">getppid<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">get<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">process<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">identification<\/span><br \/><span class=\"gutterH\">  10:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@author<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">josevnz@kodegeek<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><br \/><span class=\"gutter\">  11:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  12:<\/span><br \/><span class=\"gutter\">  13:<\/span><span class=\"syntax1\">\/*<\/span><br \/><span class=\"gutter\">  14:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Class:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">com_kodegeek_blog_unix_UnixPid<\/span><br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Method:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">getPid<\/span><br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Signature:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">()I<\/span><br \/><span class=\"gutter\">  17:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*\/<\/span><br \/><span class=\"gutter\">  18:<\/span>JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPid<br \/><span class=\"gutter\">  19:<\/span>  (JNIEnv <span class=\"syntax18\">*<\/span>, jobject) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  20:<\/span>        jint pid <span class=\"syntax18\">=<\/span> <span class=\"syntax6\">getpid<\/span>(); <br \/><span class=\"gutter\">  21:<\/span>        <span class=\"syntax8\">return<\/span> pid;  <br \/><span class=\"gutter\">  22:<\/span><span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  23:<\/span><br \/><span class=\"gutter\">  24:<\/span><span class=\"syntax1\">\/*<\/span><br \/><span class=\"gutterH\">  25:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Class:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">com_kodegeek_blog_unix_UnixPid<\/span><br \/><span class=\"gutter\">  26:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Method:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">getPpId<\/span><br \/><span class=\"gutter\">  27:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Signature:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">()I<\/span><br \/><span class=\"gutter\">  28:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*\/<\/span><br \/><span class=\"gutter\">  29:<\/span>JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPpId<br \/><span class=\"gutterH\">  30:<\/span>  (JNIEnv <span class=\"syntax18\">*<\/span>, jobject) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  31:<\/span>        jint ppid <span class=\"syntax18\">=<\/span> <span class=\"syntax6\">getppid<\/span>();<br \/><span class=\"gutter\">  32:<\/span>        <span class=\"syntax8\">return<\/span> ppid; <br \/><span class=\"gutter\">  33:<\/span><span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  34:<\/span><br \/><\/pre>\n<p>La parte complicada es el manejo de los tipos de java versus los tipos de C. Sin embargo como estas rutinas lo que retornan son enteros entonces no hay mucho rollo (son tipos primitivos, no apuntadores).<\/p>\n<p>Me decid\u00ed escribir un archivo <a href=\"http:\/\/www.gnu.org\/software\/make\/manual\/\">GNU Make<\/a> para controlar la compilaci\u00f3n del c\u00f3digo nativo en C, ya que Make esta mucho mejor dotado que Ant para estas tareas. Lo \u00fanico que hice fu\u00e9 pasarle parametros desde Ant (cosas obvias como la ubicaci\u00f3n de los archivos ya que eso se controla desde all\u00ed):<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Native<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">portion<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">of<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">FileType,<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">UnixPid<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">classes<\/span><br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax1\">#<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Author:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">josevnz@kodegeek.com<\/span><br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax1\">#<\/span><br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">The<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">following<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">variables<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">are<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">defined<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">from<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Ant:<\/span><br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">-<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">SHARED_UNIX<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">-<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">INCLUDES<\/span><br \/><span class=\"gutter\">   8:<\/span><span class=\"syntax1\">#<\/span><br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Also<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">this<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">makefile<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">is<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">tailored<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">to<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">run<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">on<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Linux<\/span><br \/><span class=\"gutterH\">  10:<\/span><span class=\"syntax1\">#<\/span><br \/><span class=\"gutter\">  11:<\/span><br \/><span class=\"gutter\">  12:<\/span>CFLAGS=-c -I<span class=\"syntax9\">$(<\/span><span class=\"syntax9\">INCLUDES<\/span><span class=\"syntax9\">)<\/span> -I<span class=\"syntax9\">$(<\/span><span class=\"syntax9\">JAVA_HOME<\/span><span class=\"syntax9\">)<\/span>\/..\/include<br \/>-I<span class=\"syntax9\">$(<\/span><span class=\"syntax9\">JAVA_HOME<\/span><span class=\"syntax9\">)<\/span>\/..\/include\/linux -Wall -fPIC<br \/><span class=\"gutter\">  13:<\/span>LDFLAGS=-shared -static -lc<br \/><span class=\"gutter\">  14:<\/span>   <br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax12\">all:<\/span><br \/><span class=\"gutter\">  16:<\/span>        g++ <span class=\"syntax9\">$(<\/span><span class=\"syntax9\">CFLAGS<\/span><span class=\"syntax9\">)<\/span> <span class=\"syntax9\">$(<\/span><span class=\"syntax9\">SRC<\/span><span class=\"syntax9\">)<\/span>\/UnixPid.C -o <span class=\"syntax9\">$(<\/span><span class=\"syntax9\">DIST<\/span><span class=\"syntax9\">)<\/span>\/UnixPid.o<br \/><span class=\"gutter\">  17:<\/span>        g++ <span class=\"syntax9\">$(<\/span><span class=\"syntax9\">LDFLAGS<\/span><span class=\"syntax9\">)<\/span> -o <span class=\"syntax9\">$(<\/span><span class=\"syntax9\">SHARED_UNIX<\/span><span class=\"syntax9\">)<\/span> <span class=\"syntax9\">$(<\/span><span class=\"syntax9\">DIST<\/span><span class=\"syntax9\">)<\/span>\/*.o<br \/><span class=\"gutter\">  18:<\/span>        rm -f <span class=\"syntax9\">$(<\/span><span class=\"syntax9\">DIST<\/span><span class=\"syntax9\">)<\/span>\/*.o<br \/><\/pre>\n<p>Una vez compilado el programa (todo lo hacemos desde Ant), lo corremos:<\/p>\n<blockquote><p>[josevnz@localhost kodegeek]$ <span style=\"font-style: italic; color: rgb(255, 0, 0);\">export LD_LIBRARY_PATH=\/home\/josevnz\/sf\/kodegeek\/dist\/Unix<\/span><br \/>[josevnz@localhost kodegeek]$ <span style=\"color: rgb(255, 0, 0);\">java -jar \/home\/josevnz\/sf\/kodegeek\/dist\/Unix\/Unix.jar<\/span><br \/>PID: 5737<br \/>PPID: 17896<br \/>[josevnz@localhost kodegeek]$<\/p><\/blockquote>\n<p>Ya para finalizar los dejo con <a href=\"https:\/\/sourceforge.net\/project\/showfiles.php?group_id=128692&#038;package_id=141099&amp;release_id=444847\">un enlace a el c\u00f3digo fuente completo, as\u00ed como los binarios<\/a>.<\/p>\n<p>Buscar en Technorati: <a href=\"http:\/\/technorati.com\/tag\/jni\" rel=\"tag\">jni<\/a>, <a href=\"http:\/\/technorati.com\/tag\/java\" rel=\"tag\">java<\/a>, <a href=\"http:\/\/technorati.com\/tag\/linux\" rel=\"tag\">linux<\/a>, <a href=\"http:\/\/technorati.com\/tag\/open+source\" rel=\"tag\">Open Source<\/a><a href=\"http:\/\/technorati.com\/tag\/perl\" rel=\"tag\"><\/a><br \/>Buscar en Blogalaxia: <a href=\"http:\/\/www.blogalaxia.com\/tags\/jni\" rel=\"tag\">jni<\/a>, <a href=\"http:\/\/www.blogalaxia.com\/tags\/java\" rel=\"tag\">java<\/a>, <a href=\"http:\/\/www.blogalaxia.com\/tags\/linux\" rel=\"tag\">linux<\/a>, <a href=\"http:\/\/www.blogalaxia.com\/tags\/open+source\" rel=\"tag\">Open Source<\/a><a href=\"http:\/\/www.blogalaxia.com\/tags\/perl\" rel=\"tag\"><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este es uno de esos experimientos que sale por la necesidad, ya que recientemente alguien en mi compa\u00f1ia me pregunt\u00f3 como hacer algo parecido y le dije que usando JNI. Sin embargo cuando me pregunt\u00f3 si alguna vez lo hab\u00eda hecho y respond\u00ed que no, y no qued\u00f3 muy impresionado. As\u00ed que me decid\u00ed a <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2006\/09\/05\/como-obtener-el-unix-uid-desde-java-jugando-con-jni\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/1105"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=1105"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/1105\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=1105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=1105"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=1105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}