<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3747560180277644578</id><updated>2025-04-26T16:47:11.645-07:00</updated><title type='text'>JAVA native access examples</title><subtitle type='html'>This is a tutorial on how to use Java Native Access to access to native shared libraries.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jnaexamples.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3747560180277644578/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://jnaexamples.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nipun</name><uri>http://www.blogger.com/profile/03807316786604175371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3747560180277644578.post-9083322688564658860</id><published>2012-03-30T21:04:00.000-07:00</published><updated>2012-03-30T21:35:32.516-07:00</updated><title type='text'></title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Java native access is an easy way to access native shared
libraries from java without depending on java native interface. JNA&#39;s design
aims to provide native access in a natural way with a minimum of effort. It
doesn’t require any generated headers and wrapper to your native library routines
unlike in the case of JNI.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
It’s an amazing library and you can get all the details &lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=3747560180277644578&quot;&gt;here.&lt;/a&gt;&amp;nbsp; Mainly you will need the jna.jar to be used
with your java program to access your native library. Jna.jar includes all the
native libraries which facilitate your java program to use the native routines.
At the heart of JNA lies an foreign function interfacing library &lt;a href=&quot;http://sourceware.org/libffi/&quot;&gt;libffi.&lt;/a&gt;&lt;br /&gt;
The java primitive data types to native data types mapping are available&amp;nbsp; &lt;a href=&quot;https://github.com/twall/jna/blob/master/www/Mappings.md&quot;&gt;here&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
There is a similar library &lt;a href=&quot;http://www.excelsior-usa.com/xfunction.html&quot;&gt;xFunction.&lt;/a&gt; But it
supports lesser number of platforms, doesn’t support 64 bit platforms and most
probably development of xFunction is stopped.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Below example is showing how we can call C library
functions. We need to define an interface which extends com.sun.jna.Library and
this will load the C library. Also we need to declare the C library functions
we will be calling from java.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;u&gt;&lt;b style=&quot;color: blue;&quot;&gt;Exmaple 1&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
Below is the first program demonstrating simple use of JNA. It calls C library routines getpid,getppid and time.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// This exaple is for linux platform only&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// Save the code in a file named jnatest.java &lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// Keep the jna.jar in the same directory&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// Then compile it as &lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// $javac -cp jna.jar jnatest.java&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
//&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// Then run it as below:&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// $java -cp .:jna.jar jnatest &lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
import com.sun.jna.Library;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
import com.sun.jna.Native;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
interface CLibrary extends Library {&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CLibrary INSTANCE = (CLibrary) Native.loadLibrary(&quot;c&quot;, CLibrary.class);&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int getpid();&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int getppid();&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; long time(long buf[]);&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
}&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
public class jnatest {&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param args&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) {&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(CLibrary.INSTANCE.getpid());&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(CLibrary.INSTANCE.getppid());&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; long[] timenul = new long[1];&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(CLibrary.INSTANCE.time(timenul));&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (UnsatisfiedLinkError e) {&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;Exception&quot; + e);&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
}&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;u&gt;&lt;b style=&quot;color: blue;&quot;&gt;Exmaple 2&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
We will now demonstrate how we can pass a reference to a pointer to the native library routines and how an array of structures may be passed to the native data and how a string may be sent to native library by reference.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Below is the C-code for our native library.&amp;nbsp; Save the code in a file test.c and now lets create a shared library.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;b&gt;$gcc -c test.c -fPI&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;b&gt;$gcc -shared -fPIC -o libtest.so test.o&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;
// Save this in a file test.c&lt;/div&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;#include &amp;lt;stdlib.h&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;struct mystruct&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int b;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;}&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;int fun_alloc(struct mystruct **allocint)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *allocint = (struct mystruct *) malloc (sizeof(struct mystruct));&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;Native allocted pointer&amp;nbsp; %p\n&quot;, *allocint);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (*allocint)-&amp;gt;a = 10000;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (*allocint)-&amp;gt;b = 20099;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;Struct field has values %d %d \n&quot;, (*allocint)-&amp;gt;a,&amp;nbsp; (*allocint)-&amp;gt;b);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;int fun_free(struct mystruct **ptr)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct mystruct *p = *ptr;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;Native Freeing mem %p with val %d %d\n&quot;, p,&amp;nbsp; p-&amp;gt;a, p-&amp;gt;b);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(p);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;int setvals(struct mystruct **ptr, int num_structs)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (num_structs &amp;lt; 0)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;Native recieved the pointer to an array of structures with %d elements\n&quot;, num_structs);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (i &amp;lt; num_structs) {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr[i]-&amp;gt;a = i;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr[i]-&amp;gt;b = i + 100;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;int setstring(char *ptr)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;Native recived string %s \n&quot;, ptr);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;Native will set first char to 1 in that string&quot;);&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr[0]=&#39;1&#39;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #a2c4c9; color: black;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// Code for class MyStruct. Save this in a file MyStruct.java in the current directory&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// &lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
import com.sun.jna.Structure;&lt;br /&gt;
import com.sun.jna.Pointer;&lt;br /&gt;
&lt;br /&gt;
public class MyStruct extends Structure implements Structure.ByReference {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public int a;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public int b;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyStruct() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyStruct(Pointer p) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;super(p);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;read();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// End of code for MyStruct.java.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Below is the code for passing a String by reference to native C library&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// This is a class that facilitates passing a String by reference to &lt;br /&gt;
// C library routines so that the string&amp;nbsp; may be modified by the C &lt;br /&gt;
// routine and the modifications is reflected on JAVA side as well&lt;br /&gt;
// Save this in a file StringByReference.java in current directory&lt;br /&gt;
&lt;br /&gt;
import com.sun.jna.ptr.ByReference;&lt;br /&gt;
&lt;br /&gt;
public class StringByReference extends ByReference {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public StringByReference() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this(0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public StringByReference(int size) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; super(size &amp;lt; 4 ? 4 : size);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; getPointer().clear(size &amp;lt; 4 ? 4 : size);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public StringByReference(String str) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; super(str.length() &amp;lt; 4 ? 4 : str.length() + 1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; setValue(str);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private void setValue(String str) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; getPointer().setString(0, str);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getValue() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return getPointer().getString(0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Below is code for jnatest2.java &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
//Code for calling our library routines&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
//Save this code in a file jnatest2.java&lt;/div&gt;
&lt;div style=&quot;background-color: #a2c4c9;&quot;&gt;
// This exaple is for linux platform only&lt;br /&gt;
// Save the code in a file named jnatest.java &lt;br /&gt;
// Keep the jna.jar in the same directory&lt;br /&gt;
// Then compile it as &lt;br /&gt;
// $javac -cp .:jna.jat MyStruct.java&lt;br /&gt;
// $javac -cp .:jna.jar jnatest2.java&lt;br /&gt;
//&lt;br /&gt;
// Then run it as below:&lt;br /&gt;
// $java -cp .:jna.jar jnatest2 &lt;br /&gt;
&lt;br /&gt;
import com.sun.jna.Library;&lt;br /&gt;
import com.sun.jna.Native;&lt;br /&gt;
import com.sun.jna.Pointer;&lt;br /&gt;
import com.sun.jna.ptr.PointerByReference;&lt;br /&gt;
&lt;br /&gt;
interface DLibrary extends Library {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DLibrary INSTANCE = (DLibrary) Native.loadLibrary(&quot;mytest&quot;, DLibrary.class);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int fun_alloc(PointerByReference p);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int fun_free(PointerByReference p);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int setstring(StringByReference str);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int setvals(MyStruct[] mstructs, int sizeofarray);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class jnatest2 {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param args&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int x;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PointerByReference pref = new PointerByReference();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; x = DLibrary.INSTANCE.fun_alloc(pref);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Pointer ptr = pref.getValue();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MyStruct mys = new MyStruct(ptr);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;Java got from&amp;nbsp; native &quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + Pointer.nativeValue(ptr) + &quot;&amp;nbsp; &quot; + mys.a + &quot; &quot; + mys.b);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DLibrary.INSTANCE.fun_free(pref);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; StringByReference mystring = new StringByReference(&quot;ZZZZZ&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DLibrary.INSTANCE.setstring(mystring);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(mystring.getValue());&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MyStruct[] mystructs = new MyStruct[10];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; x = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while (x &amp;lt; 10) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mystructs[x] = new MyStruct();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; x++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DLibrary.INSTANCE.setvals(mystructs, 10);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; x = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while (x &amp;lt; 10) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;Struct no &quot; + x + &quot; values &quot; + mystructs[x].a&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + &quot; &quot; + mystructs[x].b);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; x++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (UnsatisfiedLinkError e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;Exception&quot; + e);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jnaexamples.blogspot.com/feeds/9083322688564658860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jnaexamples.blogspot.com/2012/03/java-native-access-is-easy-way-to.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3747560180277644578/posts/default/9083322688564658860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3747560180277644578/posts/default/9083322688564658860'/><link rel='alternate' type='text/html' href='http://jnaexamples.blogspot.com/2012/03/java-native-access-is-easy-way-to.html' title=''/><author><name>Nipun</name><uri>http://www.blogger.com/profile/03807316786604175371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry></feed>