1 <!DOCTYPE html>
  2 <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
  3 <head>
  4   <meta charset="utf-8" />
  5   <meta name="generator" content="pandoc" />
  6   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  7   <title>Using Panama &quot;foreign&quot; JDK</title>
  8   <style>
  9     code{white-space: pre-wrap;}
 10     span.smallcaps{font-variant: small-caps;}
 11     span.underline{text-decoration: underline;}
 12     div.column{display: inline-block; vertical-align: top; width: 50%;}
 13     div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
 14     ul.task-list{list-style: none;}
 15     pre > code.sourceCode { white-space: pre; position: relative; }
 16     pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
 17     pre > code.sourceCode > span:empty { height: 1.2em; }
 18     code.sourceCode > span { color: inherit; text-decoration: inherit; }
 19     div.sourceCode { margin: 1em 0; }
 20     pre.sourceCode { margin: 0; }
 21     @media screen {
 22     div.sourceCode { overflow: auto; }
 23     }
 24     @media print {
 25     pre > code.sourceCode { white-space: pre-wrap; }
 26     pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
 27     }
 28     pre.numberSource code
 29       { counter-reset: source-line 0; }
 30     pre.numberSource code > span
 31       { position: relative; left: -4em; counter-increment: source-line; }
 32     pre.numberSource code > span > a:first-child::before
 33       { content: counter(source-line);
 34         position: relative; left: -1em; text-align: right; vertical-align: baseline;
 35         border: none; display: inline-block;
 36         -webkit-touch-callout: none; -webkit-user-select: none;
 37         -khtml-user-select: none; -moz-user-select: none;
 38         -ms-user-select: none; user-select: none;
 39         padding: 0 4px; width: 4em;
 40         color: #aaaaaa;
 41       }
 42     pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
 43     div.sourceCode
 44       {   }
 45     @media screen {
 46     pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
 47     }
 48     code span.al { color: #ff0000; font-weight: bold; } /* Alert */
 49     code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
 50     code span.at { color: #7d9029; } /* Attribute */
 51     code span.bn { color: #40a070; } /* BaseN */
 52     code span.bu { } /* BuiltIn */
 53     code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
 54     code span.ch { color: #4070a0; } /* Char */
 55     code span.cn { color: #880000; } /* Constant */
 56     code span.co { color: #60a0b0; font-style: italic; } /* Comment */
 57     code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
 58     code span.do { color: #ba2121; font-style: italic; } /* Documentation */
 59     code span.dt { color: #902000; } /* DataType */
 60     code span.dv { color: #40a070; } /* DecVal */
 61     code span.er { color: #ff0000; font-weight: bold; } /* Error */
 62     code span.ex { } /* Extension */
 63     code span.fl { color: #40a070; } /* Float */
 64     code span.fu { color: #06287e; } /* Function */
 65     code span.im { } /* Import */
 66     code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
 67     code span.kw { color: #007020; font-weight: bold; } /* Keyword */
 68     code span.op { color: #666666; } /* Operator */
 69     code span.ot { color: #007020; } /* Other */
 70     code span.pp { color: #bc7a00; } /* Preprocessor */
 71     code span.sc { color: #4070a0; } /* SpecialChar */
 72     code span.ss { color: #bb6688; } /* SpecialString */
 73     code span.st { color: #4070a0; } /* String */
 74     code span.va { color: #19177c; } /* Variable */
 75     code span.vs { color: #4070a0; } /* VerbatimString */
 76     code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
 77   </style>
 78   <link rel="stylesheet" href="../make/data/docs-resources/resources/jdk-default.css" />
 79   <!--[if lt IE 9]>
 80     <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
 81   <![endif]-->
 82 </head>
 83 <body>
 84 <header id="title-block-header">
 85 <h1 class="title">Using Panama "foreign" JDK</h1>
 86 </header>
 87 <nav id="TOC" role="doc-toc">
 88 <ul>
 89 <li><a href="#using-panama-foreign-jextract-jdk">Using Panama "foreign-jextract" JDK</a>
 90 <ul>
 91 <li><a href="#hello-world">Hello World</a>
 92 <ul>
 93 <li><a href="#hello-world-c-header-helloworld.h">Hello World C Header (helloworld.h)</a></li>
 94 <li><a href="#hello-world-c-source-helloworld.c">Hello World C Source (helloworld.c)</a></li>
 95 <li><a href="#building-hello-world">Building Hello World</a></li>
 96 <li><a href="#jextract-a-jar-file-for-helloworld.h">jextract a Jar file for helloworld.h</a></li>
 97 <li><a href="#java-program-that-uses-extracted-helloworld-interface">Java program that uses extracted helloworld interface</a></li>
 98 <li><a href="#running-the-java-code-that-invokes-helloworld">Running the Java code that invokes helloworld</a></li>
 99 </ul></li>
100 <li><a href="#embedding-python-interpreter-in-your-java-program-mac-os">Embedding Python interpreter in your Java program (Mac OS)</a>
101 <ul>
102 <li><a href="#jextract-python.h">jextract Python.h</a></li>
103 <li><a href="#java-program-that-uses-extracted-python-interface">Java program that uses extracted Python interface</a></li>
104 <li><a href="#running-the-java-code-that-calls-python-interpreter">Running the Java code that calls Python interpreter</a></li>
105 </ul></li>
106 <li><a href="#using-readline-library-from-java-code-mac-os">Using readline library from Java code (Mac OS)</a>
107 <ul>
108 <li><a href="#jextract-readline.h">jextract readline.h</a></li>
109 <li><a href="#java-code-that-uses-readline">Java code that uses readline</a></li>
110 <li><a href="#running-the-java-code-that-uses-readline">Running the java code that uses readline</a></li>
111 </ul></li>
112 <li><a href="#using-libcurl-from-java-mac-os">Using libcurl from Java (Mac OS)</a>
113 <ul>
114 <li><a href="#jextract-curl.h">jextract curl.h</a></li>
115 <li><a href="#java-code-that-uses-libcurl">Java code that uses libcurl</a></li>
116 <li><a href="#running-the-java-code-that-uses-libcurl">Running the java code that uses libcurl</a></li>
117 </ul></li>
118 <li><a href="#using-blas-library">Using BLAS library</a>
119 <ul>
120 <li><a href="#installing-openblas-mac-os">Installing OpenBLAS (Mac OS)</a></li>
121 <li><a href="#jextracting-cblas.h-macos">jextracting cblas.h (MacOS)</a></li>
122 <li><a href="#java-sample-code-that-uses-cblas-library">Java sample code that uses cblas library</a></li>
123 <li><a href="#compiling-and-running-the-above-blas-sample">Compiling and running the above BLAS sample</a></li>
124 </ul></li>
125 <li><a href="#using-lapack-library-mac-os">Using LAPACK library (Mac OS)</a>
126 <ul>
127 <li><a href="#jextracting-lapacke.h">jextracting lapacke.h</a></li>
128 <li><a href="#java-sample-code-that-uses-lapack-library">Java sample code that uses LAPACK library</a></li>
129 <li><a href="#compiling-and-running-the-above-lapack-sample">Compiling and running the above LAPACK sample</a></li>
130 </ul></li>
131 <li><a href="#using-libproc-library-to-list-processes-from-java-mac-os">Using libproc library to list processes from Java (Mac OS)</a>
132 <ul>
133 <li><a href="#jextract-libproc.h">jextract libproc.h</a></li>
134 <li><a href="#java-program-that-uses-libproc-to-list-processes">Java program that uses libproc to list processes</a></li>
135 <li><a href="#compiling-and-running-the-libproc-sample">Compiling and running the libproc sample</a></li>
136 </ul></li>
137 <li><a href="#using-libgit2-from-java-mac-os">Using libgit2 from Java (Mac OS)</a>
138 <ul>
139 <li><a href="#getting-and-building-libgit2">Getting and building libgit2</a></li>
140 <li><a href="#jextract-git2.h">jextract git2.h</a></li>
141 <li><a href="#java-program-that-uses-libgit2-to-clone-github-repo">Java program that uses libgit2 to clone github repo</a></li>
142 <li><a href="#compiling-and-running-the-libgit2-sample">Compiling and running the libgit2 sample</a></li>
143 <li><a href="#cloning-a-github-repo-using-the-above-run.sh-command">Cloning a github repo using the above run.sh command</a></li>
144 </ul></li>
145 <li><a href="#using-sqlite3-library-from-java-mac-os">Using sqlite3 library from Java (Mac OS)</a>
146 <ul>
147 <li><a href="#jextract-sqlite3.h">jextract sqlite3.h</a></li>
148 <li><a href="#java-program-that-uses-sqlite3">Java program that uses sqlite3</a></li>
149 <li><a href="#compiling-and-running-the-sqlite3-sample">Compiling and running the sqlite3 sample</a></li>
150 </ul></li>
151 </ul></li>
152 </ul>
153 </nav>
154 <?xml version="1.0" encoding="utf-8"?>
155 <h1 id="using-panama-foreign-jextract-jdk">Using Panama "foreign-jextract" JDK</h1>
156 <p>You can build "foreign-jextract" branch of panama repo <a href="https://github.com/openjdk/panama-foreign">https://github.com/openjdk/panama-foreign</a></p>
157 <p>Using foreign function call in Java involves the following two steps:</p>
158 <ol type="1">
159 <li>Use <strong>jextract</strong> tool to generate java interface for your C header file(s)</li>
160 <li>Invoke C functions via the jextracted Java interface</li>
161 </ol>
162 <h2 id="hello-world">Hello World</h2>
163 <h3 id="hello-world-c-header-helloworld.h">Hello World C Header (helloworld.h)</h3>
164 <div class="sourceCode" id="cb1"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb1-1"><a href="#cb1-1"></a></span>
165 <span id="cb1-2"><a href="#cb1-2"></a><span class="pp">#ifndef helloworld_h</span></span>
166 <span id="cb1-3"><a href="#cb1-3"></a><span class="pp">#define helloworld_h</span></span>
167 <span id="cb1-4"><a href="#cb1-4"></a></span>
168 <span id="cb1-5"><a href="#cb1-5"></a><span class="kw">extern</span> <span class="dt">void</span> helloworld(<span class="dt">void</span>);</span>
169 <span id="cb1-6"><a href="#cb1-6"></a></span>
170 <span id="cb1-7"><a href="#cb1-7"></a><span class="pp">#endif </span><span class="co">/* helloworld_h */</span></span>
171 <span id="cb1-8"><a href="#cb1-8"></a></span></code></pre></div>
172 <h3 id="hello-world-c-source-helloworld.c">Hello World C Source (helloworld.c)</h3>
173 <div class="sourceCode" id="cb2"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb2-1"><a href="#cb2-1"></a></span>
174 <span id="cb2-2"><a href="#cb2-2"></a><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span></span>
175 <span id="cb2-3"><a href="#cb2-3"></a></span>
176 <span id="cb2-4"><a href="#cb2-4"></a><span class="pp">#include </span><span class="im">&quot;helloworld.h&quot;</span></span>
177 <span id="cb2-5"><a href="#cb2-5"></a></span>
178 <span id="cb2-6"><a href="#cb2-6"></a><span class="dt">void</span> helloworld(<span class="dt">void</span>) {</span>
179 <span id="cb2-7"><a href="#cb2-7"></a>    printf(<span class="st">&quot;Hello World!</span><span class="sc">\n</span><span class="st">&quot;</span>);</span>
180 <span id="cb2-8"><a href="#cb2-8"></a>}</span></code></pre></div>
181 <h3 id="building-hello-world">Building Hello World</h3>
182 <div class="sourceCode" id="cb3"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1"></a></span>
183 <span id="cb3-2"><a href="#cb3-2"></a><span class="fu">cc</span> -shared -o libhelloworld.dylib helloworld.c</span></code></pre></div>
184 <h3 id="jextract-a-jar-file-for-helloworld.h">jextract a Jar file for helloworld.h</h3>
185 <div class="sourceCode" id="cb4"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1"></a></span>
186 <span id="cb4-2"><a href="#cb4-2"></a><span class="ex">jextract</span> -t org.hello -lhelloworld helloworld.h</span></code></pre></div>
187 <h3 id="java-program-that-uses-extracted-helloworld-interface">Java program that uses extracted helloworld interface</h3>
188 <div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb5-1"><a href="#cb5-1"></a></span>
189 <span id="cb5-2"><a href="#cb5-2"></a><span class="kw">import static</span><span class="im"> org.hello.helloworld_h.*;</span></span>
190 <span id="cb5-3"><a href="#cb5-3"></a></span>
191 <span id="cb5-4"><a href="#cb5-4"></a><span class="kw">public</span> <span class="kw">class</span> HelloWorld {</span>
192 <span id="cb5-5"><a href="#cb5-5"></a>    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
193 <span id="cb5-6"><a href="#cb5-6"></a>        <span class="fu">helloworld</span>();</span>
194 <span id="cb5-7"><a href="#cb5-7"></a>    }</span>
195 <span id="cb5-8"><a href="#cb5-8"></a>}</span></code></pre></div>
196 <h3 id="running-the-java-code-that-invokes-helloworld">Running the Java code that invokes helloworld</h3>
197 <div class="sourceCode" id="cb6"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1"></a></span>
198 <span id="cb6-2"><a href="#cb6-2"></a><span class="ex">java</span> -Dforeign.restricted=permit --add-modules jdk.incubator.foreign HelloWorld.java</span></code></pre></div>
199 <h2 id="embedding-python-interpreter-in-your-java-program-mac-os">Embedding Python interpreter in your Java program (Mac OS)</h2>
200 <h3 id="jextract-python.h">jextract Python.h</h3>
201 <div class="sourceCode" id="cb7"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1"></a></span>
202 <span id="cb7-2"><a href="#cb7-2"></a><span class="ex">jextract</span> -l python2.7 \</span>
203 <span id="cb7-3"><a href="#cb7-3"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include \</span>
204 <span id="cb7-4"><a href="#cb7-4"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/python2.7/ \</span>
205 <span id="cb7-5"><a href="#cb7-5"></a>  -t org.python \</span>
206 <span id="cb7-6"><a href="#cb7-6"></a>   /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/python2.7/Python.h</span></code></pre></div>
207 <h3 id="java-program-that-uses-extracted-python-interface">Java program that uses extracted Python interface</h3>
208 <div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb8-1"><a href="#cb8-1"></a></span>
209 <span id="cb8-2"><a href="#cb8-2"></a><span class="kw">import</span><span class="im"> org.python.Cstring;</span></span>
210 <span id="cb8-3"><a href="#cb8-3"></a><span class="kw">import static</span><span class="im"> jdk.incubator.foreign.MemoryAddress.NULL;</span></span>
211 <span id="cb8-4"><a href="#cb8-4"></a><span class="co">// import jextracted python &#39;header&#39; class</span></span>
212 <span id="cb8-5"><a href="#cb8-5"></a><span class="kw">import static</span><span class="im"> org.python.RuntimeHelper.*;</span></span>
213 <span id="cb8-6"><a href="#cb8-6"></a><span class="kw">import static</span><span class="im"> org.python.Python_h.*;</span></span>
214 <span id="cb8-7"><a href="#cb8-7"></a></span>
215 <span id="cb8-8"><a href="#cb8-8"></a><span class="kw">public</span> <span class="kw">class</span> PythonMain {</span>
216 <span id="cb8-9"><a href="#cb8-9"></a>    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
217 <span id="cb8-10"><a href="#cb8-10"></a>        <span class="bu">String</span> script = <span class="st">&quot;print(sum([33, 55, 66])); print(&#39;Hello from Python!&#39;)</span><span class="sc">\n</span><span class="st">&quot;</span>;</span>
218 <span id="cb8-11"><a href="#cb8-11"></a></span>
219 <span id="cb8-12"><a href="#cb8-12"></a>        <span class="fu">Py_Initialize</span>();</span>
220 <span id="cb8-13"><a href="#cb8-13"></a>        <span class="kw">try</span> (var s = Cstring.<span class="fu">toCString</span>(script)) {</span>
221 <span id="cb8-14"><a href="#cb8-14"></a>            var str = s.<span class="fu">baseAddress</span>();</span>
222 <span id="cb8-15"><a href="#cb8-15"></a>            <span class="fu">PyRun_SimpleStringFlags</span>(str, NULL);</span>
223 <span id="cb8-16"><a href="#cb8-16"></a>            <span class="fu">Py_Finalize</span>();</span>
224 <span id="cb8-17"><a href="#cb8-17"></a>        }</span>
225 <span id="cb8-18"><a href="#cb8-18"></a>    }</span>
226 <span id="cb8-19"><a href="#cb8-19"></a>}</span></code></pre></div>
227 <h3 id="running-the-java-code-that-calls-python-interpreter">Running the Java code that calls Python interpreter</h3>
228 <div class="sourceCode" id="cb9"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1"></a></span>
229 <span id="cb9-2"><a href="#cb9-2"></a><span class="ex">java</span> -Dforeign.restricted=permit --add-modules jdk.incubator.foreign \</span>
230 <span id="cb9-3"><a href="#cb9-3"></a>    -Djava.library.path=/System/Library/Frameworks/Python.framework/Versions/2.7/lib \</span>
231 <span id="cb9-4"><a href="#cb9-4"></a>    PythonMain.java</span></code></pre></div>
232 <h2 id="using-readline-library-from-java-code-mac-os">Using readline library from Java code (Mac OS)</h2>
233 <h3 id="jextract-readline.h">jextract readline.h</h3>
234 <div class="sourceCode" id="cb10"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1"></a></span>
235 <span id="cb10-2"><a href="#cb10-2"></a><span class="ex">jextract</span> -l readline -t org.unix \</span>
236 <span id="cb10-3"><a href="#cb10-3"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include \</span>
237 <span id="cb10-4"><a href="#cb10-4"></a>   /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/readline/readline.h</span></code></pre></div>
238 <h3 id="java-code-that-uses-readline">Java code that uses readline</h3>
239 <div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb11-1"><a href="#cb11-1"></a></span>
240 <span id="cb11-2"><a href="#cb11-2"></a><span class="kw">import</span><span class="im"> org.unix.Cstring;</span></span>
241 <span id="cb11-3"><a href="#cb11-3"></a><span class="kw">import static</span><span class="im"> org.unix.RuntimeHelper.*;</span></span>
242 <span id="cb11-4"><a href="#cb11-4"></a><span class="kw">import static</span><span class="im"> org.unix.readline_h.*;</span></span>
243 <span id="cb11-5"><a href="#cb11-5"></a></span>
244 <span id="cb11-6"><a href="#cb11-6"></a><span class="kw">public</span> <span class="kw">class</span> Readline {</span>
245 <span id="cb11-7"><a href="#cb11-7"></a>    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
246 <span id="cb11-8"><a href="#cb11-8"></a>        <span class="kw">try</span> (var s = Cstring.<span class="fu">toCString</span>(<span class="st">&quot;name? &quot;</span>)) {</span>
247 <span id="cb11-9"><a href="#cb11-9"></a>            var pstr = s.<span class="fu">baseAddress</span>();</span>
248 <span id="cb11-10"><a href="#cb11-10"></a>            <span class="co">// call &quot;readline&quot; API</span></span>
249 <span id="cb11-11"><a href="#cb11-11"></a>            var p = <span class="fu">readline</span>(pstr);</span>
250 <span id="cb11-12"><a href="#cb11-12"></a></span>
251 <span id="cb11-13"><a href="#cb11-13"></a>            <span class="co">// print char* as is</span></span>
252 <span id="cb11-14"><a href="#cb11-14"></a>            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(p);</span>
253 <span id="cb11-15"><a href="#cb11-15"></a>            <span class="co">// convert char* ptr from readline as Java String &amp; print it</span></span>
254 <span id="cb11-16"><a href="#cb11-16"></a>            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Hello, &quot;</span> + Cstring.<span class="fu">toJavaString</span>(p));</span>
255 <span id="cb11-17"><a href="#cb11-17"></a>        }</span>
256 <span id="cb11-18"><a href="#cb11-18"></a>    }</span>
257 <span id="cb11-19"><a href="#cb11-19"></a>}</span></code></pre></div>
258 <h3 id="running-the-java-code-that-uses-readline">Running the java code that uses readline</h3>
259 <pre><code>java -Dforeign.restricted=permit --add-modules jdk.incubator.foreign \
260     -Djava.library.path=/usr/local/opt/readline/lib/ Readline.java
261 </code></pre>
262 <h2 id="using-libcurl-from-java-mac-os">Using libcurl from Java (Mac OS)</h2>
263 <h3 id="jextract-curl.h">jextract curl.h</h3>
264 <div class="sourceCode" id="cb13"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1"></a></span>
265 <span id="cb13-2"><a href="#cb13-2"></a><span class="ex">jextract</span> -t org.unix -lcurl \</span>
266 <span id="cb13-3"><a href="#cb13-3"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/ \</span>
267 <span id="cb13-4"><a href="#cb13-4"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/curl/ \</span>
268 <span id="cb13-5"><a href="#cb13-5"></a>  /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/curl/curl.h</span></code></pre></div>
269 <h3 id="java-code-that-uses-libcurl">Java code that uses libcurl</h3>
270 <div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb14-1"><a href="#cb14-1"></a></span>
271 <span id="cb14-2"><a href="#cb14-2"></a><span class="kw">import</span><span class="im"> org.unix.Cstring;</span></span>
272 <span id="cb14-3"><a href="#cb14-3"></a><span class="kw">import static</span><span class="im"> jdk.incubator.foreign.MemoryAddress.NULL;</span></span>
273 <span id="cb14-4"><a href="#cb14-4"></a><span class="kw">import static</span><span class="im"> org.unix.RuntimeHelper.*;</span></span>
274 <span id="cb14-5"><a href="#cb14-5"></a><span class="kw">import static</span><span class="im"> org.unix.curl_h.*;</span></span>
275 <span id="cb14-6"><a href="#cb14-6"></a></span>
276 <span id="cb14-7"><a href="#cb14-7"></a><span class="kw">public</span> <span class="kw">class</span> CurlMain {</span>
277 <span id="cb14-8"><a href="#cb14-8"></a>   <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
278 <span id="cb14-9"><a href="#cb14-9"></a>       var urlStr = args[<span class="dv">0</span>];</span>
279 <span id="cb14-10"><a href="#cb14-10"></a>       <span class="fu">curl_global_init</span>(<span class="fu">CURL_GLOBAL_DEFAULT</span>());</span>
280 <span id="cb14-11"><a href="#cb14-11"></a>       var curl = <span class="fu">curl_easy_init</span>();</span>
281 <span id="cb14-12"><a href="#cb14-12"></a>       <span class="kw">if</span>(!curl.<span class="fu">equals</span>(NULL)) {</span>
282 <span id="cb14-13"><a href="#cb14-13"></a>           <span class="kw">try</span> (var s = Cstring.<span class="fu">toCString</span>(urlStr)) {</span>
283 <span id="cb14-14"><a href="#cb14-14"></a>               var url = s.<span class="fu">baseAddress</span>();</span>
284 <span id="cb14-15"><a href="#cb14-15"></a>               <span class="fu">curl_easy_setopt</span>(curl, <span class="fu">CURLOPT_URL</span>(), url);</span>
285 <span id="cb14-16"><a href="#cb14-16"></a>               <span class="dt">int</span> res = <span class="fu">curl_easy_perform</span>(curl);</span>
286 <span id="cb14-17"><a href="#cb14-17"></a>               <span class="kw">if</span> (res != <span class="fu">CURLE_OK</span>()) {</span>
287 <span id="cb14-18"><a href="#cb14-18"></a>                   <span class="fu">curl_easy_cleanup</span>(curl);</span>
288 <span id="cb14-19"><a href="#cb14-19"></a>               }</span>
289 <span id="cb14-20"><a href="#cb14-20"></a>           }</span>
290 <span id="cb14-21"><a href="#cb14-21"></a>       }</span>
291 <span id="cb14-22"><a href="#cb14-22"></a>       <span class="fu">curl_global_cleanup</span>();</span>
292 <span id="cb14-23"><a href="#cb14-23"></a>   }</span>
293 <span id="cb14-24"><a href="#cb14-24"></a>}</span></code></pre></div>
294 <h3 id="running-the-java-code-that-uses-libcurl">Running the java code that uses libcurl</h3>
295 <div class="sourceCode" id="cb15"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb15-1"><a href="#cb15-1"></a></span>
296 <span id="cb15-2"><a href="#cb15-2"></a><span class="co"># run this shell script by passing a URL as first argument</span></span>
297 <span id="cb15-3"><a href="#cb15-3"></a><span class="ex">java</span> -Dforeign.restricted=permit --add-modules jdk.incubator.foreign \</span>
298 <span id="cb15-4"><a href="#cb15-4"></a>    -Djava.library.path=/usr/lib CurlMain.java <span class="va">$*</span></span></code></pre></div>
299 <h2 id="using-blas-library">Using BLAS library</h2>
300 <p>BLAS is a popular library that allows fast matrix and vector computation: <a href="http://www.netlib.org/blas/">http://www.netlib.org/blas/</a>.</p>
301 <h3 id="installing-openblas-mac-os">Installing OpenBLAS (Mac OS)</h3>
302 <p>On Mac, blas is available as part of the OpenBLAS library: <a href="https://github.com/xianyi/OpenBLAS/wiki">https://github.com/xianyi/OpenBLAS/wiki</a></p>
303 <p>OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.</p>
304 <p>You can install openblas using HomeBrew</p>
305 <div class="sourceCode" id="cb16"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb16-1"><a href="#cb16-1"></a></span>
306 <span id="cb16-2"><a href="#cb16-2"></a><span class="ex">brew</span> install openblas</span></code></pre></div>
307 <p>It installs include and lib directories under /usr/local/opt/openblas</p>
308 <h3 id="jextracting-cblas.h-macos">jextracting cblas.h (MacOS)</h3>
309 <p>The following command can be used to extract cblas.h on MacOs</p>
310 <div class="sourceCode" id="cb17"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb17-1"><a href="#cb17-1"></a></span>
311 <span id="cb17-2"><a href="#cb17-2"></a><span class="ex">jextract</span> -C <span class="st">&quot;-D FORCE_OPENBLAS_COMPLEX_STRUCT&quot;</span> \</span>
312 <span id="cb17-3"><a href="#cb17-3"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include \</span>
313 <span id="cb17-4"><a href="#cb17-4"></a>  -l openblas -t blas /usr/local/opt/openblas/include/cblas.h</span></code></pre></div>
314 <h3 id="java-sample-code-that-uses-cblas-library">Java sample code that uses cblas library</h3>
315 <div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb18-1"><a href="#cb18-1"></a></span>
316 <span id="cb18-2"><a href="#cb18-2"></a><span class="kw">import</span><span class="im"> jdk.incubator.foreign.NativeAllocationScope;</span></span>
317 <span id="cb18-3"><a href="#cb18-3"></a><span class="kw">import</span><span class="im"> blas.*;</span></span>
318 <span id="cb18-4"><a href="#cb18-4"></a><span class="kw">import static</span><span class="im"> blas.RuntimeHelper.*;</span></span>
319 <span id="cb18-5"><a href="#cb18-5"></a><span class="kw">import static</span><span class="im"> blas.cblas_h.*;</span></span>
320 <span id="cb18-6"><a href="#cb18-6"></a></span>
321 <span id="cb18-7"><a href="#cb18-7"></a><span class="kw">public</span> <span class="kw">class</span> TestBlas {</span>
322 <span id="cb18-8"><a href="#cb18-8"></a>    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
323 <span id="cb18-9"><a href="#cb18-9"></a>        <span class="dt">int</span> Layout;</span>
324 <span id="cb18-10"><a href="#cb18-10"></a>        <span class="dt">int</span> transa;</span>
325 <span id="cb18-11"><a href="#cb18-11"></a></span>
326 <span id="cb18-12"><a href="#cb18-12"></a>        <span class="dt">double</span> alpha, beta;</span>
327 <span id="cb18-13"><a href="#cb18-13"></a>        <span class="dt">int</span> m, n, lda, incx, incy, i;</span>
328 <span id="cb18-14"><a href="#cb18-14"></a></span>
329 <span id="cb18-15"><a href="#cb18-15"></a>        Layout = <span class="fu">CblasColMajor</span>();</span>
330 <span id="cb18-16"><a href="#cb18-16"></a>        transa = <span class="fu">CblasNoTrans</span>();</span>
331 <span id="cb18-17"><a href="#cb18-17"></a></span>
332 <span id="cb18-18"><a href="#cb18-18"></a>        m = <span class="dv">4</span>; <span class="co">/* Size of Column ( the number of rows ) */</span></span>
333 <span id="cb18-19"><a href="#cb18-19"></a>        n = <span class="dv">4</span>; <span class="co">/* Size of Row ( the number of columns ) */</span></span>
334 <span id="cb18-20"><a href="#cb18-20"></a>        lda = <span class="dv">4</span>; <span class="co">/* Leading dimension of 5 * 4 matrix is 5 */</span></span>
335 <span id="cb18-21"><a href="#cb18-21"></a>        incx = <span class="dv">1</span>;</span>
336 <span id="cb18-22"><a href="#cb18-22"></a>        incy = <span class="dv">1</span>;</span>
337 <span id="cb18-23"><a href="#cb18-23"></a>        alpha = <span class="dv">1</span>;</span>
338 <span id="cb18-24"><a href="#cb18-24"></a>        beta = <span class="dv">0</span>;</span>
339 <span id="cb18-25"><a href="#cb18-25"></a>        <span class="kw">try</span> (NativeAllocationScope scope = NativeAllocationScope.<span class="fu">unboundedScope</span>()) {</span>
340 <span id="cb18-26"><a href="#cb18-26"></a>            var a = Cdouble.<span class="fu">allocateArray</span>(m*n, scope);</span>
341 <span id="cb18-27"><a href="#cb18-27"></a>            var x = Cdouble.<span class="fu">allocateArray</span>(n, scope);</span>
342 <span id="cb18-28"><a href="#cb18-28"></a>            var y = Cdouble.<span class="fu">allocateArray</span>(n, scope);</span>
343 <span id="cb18-29"><a href="#cb18-29"></a></span>
344 <span id="cb18-30"><a href="#cb18-30"></a>            <span class="co">/* The elements of the first column */</span></span>
345 <span id="cb18-31"><a href="#cb18-31"></a>            Cdouble.<span class="fu">set</span>(a, <span class="dv">0</span>, <span class="fl">1.</span><span class="dv">0</span>);</span>
346 <span id="cb18-32"><a href="#cb18-32"></a>            Cdouble.<span class="fu">set</span>(a, <span class="dv">1</span>, <span class="fl">2.</span><span class="dv">0</span>);</span>
347 <span id="cb18-33"><a href="#cb18-33"></a>            Cdouble.<span class="fu">set</span>(a, <span class="dv">2</span>, <span class="fl">3.</span><span class="dv">0</span>);</span>
348 <span id="cb18-34"><a href="#cb18-34"></a>            Cdouble.<span class="fu">set</span>(a, <span class="dv">3</span>, <span class="fl">4.</span><span class="dv">0</span>);</span>
349 <span id="cb18-35"><a href="#cb18-35"></a>            <span class="co">/* The elements of the second column */</span></span>
350 <span id="cb18-36"><a href="#cb18-36"></a>            Cdouble.<span class="fu">set</span>(a, m, <span class="fl">1.</span><span class="dv">0</span>);</span>
351 <span id="cb18-37"><a href="#cb18-37"></a>            Cdouble.<span class="fu">set</span>(a, m + <span class="dv">1</span>, <span class="fl">1.</span><span class="dv">0</span>);</span>
352 <span id="cb18-38"><a href="#cb18-38"></a>            Cdouble.<span class="fu">set</span>(a, m + <span class="dv">2</span>, <span class="fl">1.</span><span class="dv">0</span>);</span>
353 <span id="cb18-39"><a href="#cb18-39"></a>            Cdouble.<span class="fu">set</span>(a, m + <span class="dv">3</span>, <span class="fl">1.</span><span class="dv">0</span>);</span>
354 <span id="cb18-40"><a href="#cb18-40"></a>            <span class="co">/* The elements of the third column */</span></span>
355 <span id="cb18-41"><a href="#cb18-41"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">2</span>, <span class="fl">3.</span><span class="dv">0</span>);</span>
356 <span id="cb18-42"><a href="#cb18-42"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">2</span> + <span class="dv">1</span>, <span class="fl">4.</span><span class="dv">0</span>);</span>
357 <span id="cb18-43"><a href="#cb18-43"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">2</span> + <span class="dv">2</span>, <span class="fl">5.</span><span class="dv">0</span>);</span>
358 <span id="cb18-44"><a href="#cb18-44"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">2</span> + <span class="dv">3</span>, <span class="fl">6.</span><span class="dv">0</span>);</span>
359 <span id="cb18-45"><a href="#cb18-45"></a>            <span class="co">/* The elements of the fourth column */</span></span>
360 <span id="cb18-46"><a href="#cb18-46"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">3</span>, <span class="fl">5.</span><span class="dv">0</span>);</span>
361 <span id="cb18-47"><a href="#cb18-47"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">3</span> + <span class="dv">1</span>, <span class="fl">6.</span><span class="dv">0</span>);</span>
362 <span id="cb18-48"><a href="#cb18-48"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">3</span> + <span class="dv">2</span>, <span class="fl">7.</span><span class="dv">0</span>);</span>
363 <span id="cb18-49"><a href="#cb18-49"></a>            Cdouble.<span class="fu">set</span>(a, m*<span class="dv">3</span> + <span class="dv">3</span>, <span class="fl">8.</span><span class="dv">0</span>);</span>
364 <span id="cb18-50"><a href="#cb18-50"></a>            <span class="co">/* The elemetns of x and y */</span></span>
365 <span id="cb18-51"><a href="#cb18-51"></a>            Cdouble.<span class="fu">set</span>(x, <span class="dv">0</span>, <span class="fl">1.</span><span class="dv">0</span>);</span>
366 <span id="cb18-52"><a href="#cb18-52"></a>            Cdouble.<span class="fu">set</span>(x, <span class="dv">1</span>, <span class="fl">2.</span><span class="dv">0</span>);</span>
367 <span id="cb18-53"><a href="#cb18-53"></a>            Cdouble.<span class="fu">set</span>(x, <span class="dv">2</span>, <span class="fl">1.</span><span class="dv">0</span>);</span>
368 <span id="cb18-54"><a href="#cb18-54"></a>            Cdouble.<span class="fu">set</span>(x, <span class="dv">3</span>, <span class="fl">1.</span><span class="dv">0</span>);</span>
369 <span id="cb18-55"><a href="#cb18-55"></a>            Cdouble.<span class="fu">set</span>(y, <span class="dv">0</span>, <span class="fl">0.</span><span class="dv">0</span>);</span>
370 <span id="cb18-56"><a href="#cb18-56"></a>            Cdouble.<span class="fu">set</span>(y, <span class="dv">1</span>, <span class="fl">0.</span><span class="dv">0</span>);</span>
371 <span id="cb18-57"><a href="#cb18-57"></a>            Cdouble.<span class="fu">set</span>(y, <span class="dv">2</span>, <span class="fl">0.</span><span class="dv">0</span>);</span>
372 <span id="cb18-58"><a href="#cb18-58"></a>            Cdouble.<span class="fu">set</span>(y, <span class="dv">3</span>, <span class="fl">0.</span><span class="dv">0</span>);</span>
373 <span id="cb18-59"><a href="#cb18-59"></a>            <span class="fu">cblas_dgemv</span>(Layout, transa, m, n, alpha, a, lda, x, incx, beta, y, incy);</span>
374 <span id="cb18-60"><a href="#cb18-60"></a>            <span class="co">/* Print y */</span></span>
375 <span id="cb18-61"><a href="#cb18-61"></a>            <span class="kw">for</span> (i = <span class="dv">0</span>; i &lt; n; i++) {</span>
376 <span id="cb18-62"><a href="#cb18-62"></a>                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">print</span>(<span class="bu">String</span><span class="fu">.format</span>(<span class="st">&quot; y</span><span class="sc">%d</span><span class="st"> = </span><span class="sc">%f\n</span><span class="st">&quot;</span>, i, Cdouble.<span class="fu">get</span>(y, (<span class="dt">long</span>)i)));</span>
377 <span id="cb18-63"><a href="#cb18-63"></a>            }</span>
378 <span id="cb18-64"><a href="#cb18-64"></a>        }</span>
379 <span id="cb18-65"><a href="#cb18-65"></a>    }</span>
380 <span id="cb18-66"><a href="#cb18-66"></a>}</span></code></pre></div>
381 <h3 id="compiling-and-running-the-above-blas-sample">Compiling and running the above BLAS sample</h3>
382 <div class="sourceCode" id="cb19"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb19-1"><a href="#cb19-1"></a></span>
383 <span id="cb19-2"><a href="#cb19-2"></a><span class="ex">java</span> -Dforeign.restricted=permit --add-modules jdk.incubator.foreign \</span>
384 <span id="cb19-3"><a href="#cb19-3"></a>    -Djava.library.path=/usr/local/opt/openblas/lib \</span>
385 <span id="cb19-4"><a href="#cb19-4"></a>    TestBlas.java</span></code></pre></div>
386 <h2 id="using-lapack-library-mac-os">Using LAPACK library (Mac OS)</h2>
387 <p>On Mac OS, lapack is installed under /usr/local/opt/lapack directory.</p>
388 <h3 id="jextracting-lapacke.h">jextracting lapacke.h</h3>
389 <div class="sourceCode" id="cb20"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb20-1"><a href="#cb20-1"></a></span>
390 <span id="cb20-2"><a href="#cb20-2"></a><span class="ex">jextract</span> \</span>
391 <span id="cb20-3"><a href="#cb20-3"></a>   -I /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include \</span>
392 <span id="cb20-4"><a href="#cb20-4"></a>   -l lapacke -t lapack \</span>
393 <span id="cb20-5"><a href="#cb20-5"></a>   --filter lapacke.h \</span>
394 <span id="cb20-6"><a href="#cb20-6"></a>   /usr/local/opt/lapack/include/lapacke.h</span></code></pre></div>
395 <h3 id="java-sample-code-that-uses-lapack-library">Java sample code that uses LAPACK library</h3>
396 <div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb21-1"><a href="#cb21-1"></a></span>
397 <span id="cb21-2"><a href="#cb21-2"></a><span class="kw">import</span><span class="im"> jdk.incubator.foreign.NativeAllocationScope;</span></span>
398 <span id="cb21-3"><a href="#cb21-3"></a><span class="kw">import</span><span class="im"> lapack.*;</span></span>
399 <span id="cb21-4"><a href="#cb21-4"></a><span class="kw">import static</span><span class="im"> lapack.lapacke_h.*;</span></span>
400 <span id="cb21-5"><a href="#cb21-5"></a></span>
401 <span id="cb21-6"><a href="#cb21-6"></a><span class="kw">public</span> <span class="kw">class</span> TestLapack {</span>
402 <span id="cb21-7"><a href="#cb21-7"></a>    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
403 <span id="cb21-8"><a href="#cb21-8"></a></span>
404 <span id="cb21-9"><a href="#cb21-9"></a>        <span class="co">/* Locals */</span></span>
405 <span id="cb21-10"><a href="#cb21-10"></a>        <span class="kw">try</span> (var scope = NativeAllocationScope.<span class="fu">unboundedScope</span>()) {</span>
406 <span id="cb21-11"><a href="#cb21-11"></a>            var A = Cdouble.<span class="fu">allocateArray</span>(<span class="kw">new</span> <span class="dt">double</span>[]{</span>
407 <span id="cb21-12"><a href="#cb21-12"></a>                    <span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span>, <span class="dv">1</span>, <span class="dv">3</span>, <span class="dv">5</span>, <span class="dv">2</span>, <span class="dv">4</span>, <span class="dv">1</span>, <span class="dv">4</span>, <span class="dv">2</span>, <span class="dv">5</span>, <span class="dv">3</span></span>
408 <span id="cb21-13"><a href="#cb21-13"></a>            }, scope);</span>
409 <span id="cb21-14"><a href="#cb21-14"></a>            var b = Cdouble.<span class="fu">allocateArray</span>(<span class="kw">new</span> <span class="dt">double</span>[]{</span>
410 <span id="cb21-15"><a href="#cb21-15"></a>                    -<span class="dv">10</span>, <span class="dv">12</span>, <span class="dv">14</span>, <span class="dv">16</span>, <span class="dv">18</span>, -<span class="dv">3</span>, <span class="dv">14</span>, <span class="dv">12</span>, <span class="dv">16</span>, <span class="dv">16</span></span>
411 <span id="cb21-16"><a href="#cb21-16"></a>            }, scope);</span>
412 <span id="cb21-17"><a href="#cb21-17"></a>            <span class="dt">int</span> info, m, n, lda, ldb, nrhs;</span>
413 <span id="cb21-18"><a href="#cb21-18"></a></span>
414 <span id="cb21-19"><a href="#cb21-19"></a>            <span class="co">/* Initialization */</span></span>
415 <span id="cb21-20"><a href="#cb21-20"></a>            m = <span class="dv">5</span>;</span>
416 <span id="cb21-21"><a href="#cb21-21"></a>            n = <span class="dv">3</span>;</span>
417 <span id="cb21-22"><a href="#cb21-22"></a>            nrhs = <span class="dv">2</span>;</span>
418 <span id="cb21-23"><a href="#cb21-23"></a>            lda = <span class="dv">5</span>;</span>
419 <span id="cb21-24"><a href="#cb21-24"></a>            ldb = <span class="dv">5</span>;</span>
420 <span id="cb21-25"><a href="#cb21-25"></a></span>
421 <span id="cb21-26"><a href="#cb21-26"></a>            <span class="co">/* Print Entry Matrix */</span></span>
422 <span id="cb21-27"><a href="#cb21-27"></a>            <span class="fu">print_matrix_colmajor</span>(<span class="st">&quot;Entry Matrix A&quot;</span>, m, n, A, lda );</span>
423 <span id="cb21-28"><a href="#cb21-28"></a>            <span class="co">/* Print Right Rand Side */</span></span>
424 <span id="cb21-29"><a href="#cb21-29"></a>            <span class="fu">print_matrix_colmajor</span>(<span class="st">&quot;Right Hand Side b&quot;</span>, n, nrhs, b, ldb );</span>
425 <span id="cb21-30"><a href="#cb21-30"></a>            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</span>
426 <span id="cb21-31"><a href="#cb21-31"></a></span>
427 <span id="cb21-32"><a href="#cb21-32"></a>            <span class="co">/* Executable statements */</span></span>
428 <span id="cb21-33"><a href="#cb21-33"></a>            <span class="co">//            printf( &quot;LAPACKE_dgels (col-major, high-level) Example Program Results\n&quot; );</span></span>
429 <span id="cb21-34"><a href="#cb21-34"></a>            <span class="co">/* Solve least squares problem*/</span></span>
430 <span id="cb21-35"><a href="#cb21-35"></a>            info = <span class="fu">LAPACKE_dgels</span>(<span class="fu">LAPACK_COL_MAJOR</span>(), (<span class="dt">byte</span>)<span class="ch">&#39;N&#39;</span>, m, n, nrhs, A, lda, b, ldb);</span>
431 <span id="cb21-36"><a href="#cb21-36"></a></span>
432 <span id="cb21-37"><a href="#cb21-37"></a>            <span class="co">/* Print Solution */</span></span>
433 <span id="cb21-38"><a href="#cb21-38"></a>            <span class="fu">print_matrix_colmajor</span>(<span class="st">&quot;Solution&quot;</span>, n, nrhs, b, ldb );</span>
434 <span id="cb21-39"><a href="#cb21-39"></a>            <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</span>
435 <span id="cb21-40"><a href="#cb21-40"></a>            <span class="bu">System</span>.<span class="fu">exit</span>(info);</span>
436 <span id="cb21-41"><a href="#cb21-41"></a>        }</span>
437 <span id="cb21-42"><a href="#cb21-42"></a>    }</span>
438 <span id="cb21-43"><a href="#cb21-43"></a></span>
439 <span id="cb21-44"><a href="#cb21-44"></a>    <span class="dt">static</span> <span class="dt">void</span> <span class="fu">print_matrix_colmajor</span>(<span class="bu">String</span> msg, <span class="dt">int</span> m, <span class="dt">int</span> n, MemoryAddress mat, <span class="dt">int</span> ldm) {</span>
440 <span id="cb21-45"><a href="#cb21-45"></a>        <span class="dt">int</span> i, j;</span>
441 <span id="cb21-46"><a href="#cb21-46"></a>        <span class="bu">System</span>.<span class="fu">out.printf</span>(<span class="st">&quot;</span><span class="sc">\n</span><span class="st"> </span><span class="sc">%s\n</span><span class="st">&quot;</span>, msg);</span>
442 <span id="cb21-47"><a href="#cb21-47"></a></span>
443 <span id="cb21-48"><a href="#cb21-48"></a>        <span class="kw">for</span>( i = <span class="dv">0</span>; i &lt; m; i++ ) {</span>
444 <span id="cb21-49"><a href="#cb21-49"></a>            <span class="kw">for</span>( j = <span class="dv">0</span>; j &lt; n; j++ ) <span class="bu">System</span>.<span class="fu">out.printf</span>(<span class="st">&quot; </span><span class="sc">%6.2f</span><span class="st">&quot;</span>, Cdouble.<span class="fu">get</span>(mat, i+j*ldm));</span>
445 <span id="cb21-50"><a href="#cb21-50"></a>            <span class="bu">System</span>.<span class="fu">out.printf</span>( <span class="st">&quot;</span><span class="sc">\n</span><span class="st">&quot;</span> );</span>
446 <span id="cb21-51"><a href="#cb21-51"></a>        }</span>
447 <span id="cb21-52"><a href="#cb21-52"></a>    }</span>
448 <span id="cb21-53"><a href="#cb21-53"></a>}</span></code></pre></div>
449 <h3 id="compiling-and-running-the-above-lapack-sample">Compiling and running the above LAPACK sample</h3>
450 <div class="sourceCode" id="cb22"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb22-1"><a href="#cb22-1"></a></span>
451 <span id="cb22-2"><a href="#cb22-2"></a><span class="ex">java</span> -Dforeign.restricted=permit \</span>
452 <span id="cb22-3"><a href="#cb22-3"></a>    --add-modules jdk.incubator.foreign \</span>
453 <span id="cb22-4"><a href="#cb22-4"></a>    -Djava.library.path=/usr/local/opt/lapack/lib \</span>
454 <span id="cb22-5"><a href="#cb22-5"></a>    TestLapack.java</span></code></pre></div>
455 <h2 id="using-libproc-library-to-list-processes-from-java-mac-os">Using libproc library to list processes from Java (Mac OS)</h2>
456 <h3 id="jextract-libproc.h">jextract libproc.h</h3>
457 <div class="sourceCode" id="cb23"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb23-1"><a href="#cb23-1"></a></span>
458 <span id="cb23-2"><a href="#cb23-2"></a><span class="ex">jextract</span> -t org.unix \</span>
459 <span id="cb23-3"><a href="#cb23-3"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include \</span>
460 <span id="cb23-4"><a href="#cb23-4"></a>  --filter libproc.h \</span>
461 <span id="cb23-5"><a href="#cb23-5"></a>  /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libproc.h</span></code></pre></div>
462 <h3 id="java-program-that-uses-libproc-to-list-processes">Java program that uses libproc to list processes</h3>
463 <div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb24-1"><a href="#cb24-1"></a></span>
464 <span id="cb24-2"><a href="#cb24-2"></a><span class="kw">import</span><span class="im"> jdk.incubator.foreign.NativeAllocationScope;</span></span>
465 <span id="cb24-3"><a href="#cb24-3"></a><span class="kw">import</span><span class="im"> org.unix.*;</span></span>
466 <span id="cb24-4"><a href="#cb24-4"></a><span class="kw">import static</span><span class="im"> jdk.incubator.foreign.MemoryAddress.NULL;</span></span>
467 <span id="cb24-5"><a href="#cb24-5"></a><span class="kw">import static</span><span class="im"> org.unix.libproc_h.*;</span></span>
468 <span id="cb24-6"><a href="#cb24-6"></a></span>
469 <span id="cb24-7"><a href="#cb24-7"></a><span class="kw">public</span> <span class="kw">class</span> LibprocMain {</span>
470 <span id="cb24-8"><a href="#cb24-8"></a>    <span class="kw">private</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> NAME_BUF_MAX = <span class="dv">256</span>;</span>
471 <span id="cb24-9"><a href="#cb24-9"></a></span>
472 <span id="cb24-10"><a href="#cb24-10"></a>    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
473 <span id="cb24-11"><a href="#cb24-11"></a>        <span class="kw">try</span> (var scope = NativeAllocationScope.<span class="fu">unboundedScope</span>()) {</span>
474 <span id="cb24-12"><a href="#cb24-12"></a>            <span class="co">// get the number of processes</span></span>
475 <span id="cb24-13"><a href="#cb24-13"></a>            <span class="dt">int</span> numPids = <span class="fu">proc_listallpids</span>(NULL, <span class="dv">0</span>);</span>
476 <span id="cb24-14"><a href="#cb24-14"></a>            <span class="co">// allocate an array</span></span>
477 <span id="cb24-15"><a href="#cb24-15"></a>            var pids = Cint.<span class="fu">allocateArray</span>(numPids, scope);</span>
478 <span id="cb24-16"><a href="#cb24-16"></a>            <span class="co">// list all the pids into the native array</span></span>
479 <span id="cb24-17"><a href="#cb24-17"></a>            <span class="fu">proc_listallpids</span>(pids, numPids);</span>
480 <span id="cb24-18"><a href="#cb24-18"></a>            <span class="co">// convert native array to java array</span></span>
481 <span id="cb24-19"><a href="#cb24-19"></a>            <span class="dt">int</span>[] jpids = Cint.<span class="fu">toJavaArray</span>(pids.<span class="fu">segment</span>());</span>
482 <span id="cb24-20"><a href="#cb24-20"></a>            <span class="co">// buffer for process name</span></span>
483 <span id="cb24-21"><a href="#cb24-21"></a>            var nameBuf = Cchar.<span class="fu">allocateArray</span>(NAME_BUF_MAX,scope);</span>
484 <span id="cb24-22"><a href="#cb24-22"></a>            <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; jpids.<span class="fu">length</span>; i++) {</span>
485 <span id="cb24-23"><a href="#cb24-23"></a>                <span class="dt">int</span> pid = jpids[i];</span>
486 <span id="cb24-24"><a href="#cb24-24"></a>                <span class="co">// get the process name</span></span>
487 <span id="cb24-25"><a href="#cb24-25"></a>                <span class="fu">proc_name</span>(pid, nameBuf, NAME_BUF_MAX);</span>
488 <span id="cb24-26"><a href="#cb24-26"></a>                <span class="bu">String</span> procName = Cstring.<span class="fu">toJavaString</span>(nameBuf);</span>
489 <span id="cb24-27"><a href="#cb24-27"></a>                <span class="co">// print pid and process name</span></span>
490 <span id="cb24-28"><a href="#cb24-28"></a>                <span class="bu">System</span>.<span class="fu">out.printf</span>(<span class="st">&quot;</span><span class="sc">%d</span><span class="st"> </span><span class="sc">%s\n</span><span class="st">&quot;</span>, pid, procName);</span>
491 <span id="cb24-29"><a href="#cb24-29"></a>            }</span>
492 <span id="cb24-30"><a href="#cb24-30"></a>        }</span>
493 <span id="cb24-31"><a href="#cb24-31"></a>    }</span>
494 <span id="cb24-32"><a href="#cb24-32"></a>}</span></code></pre></div>
495 <h3 id="compiling-and-running-the-libproc-sample">Compiling and running the libproc sample</h3>
496 <div class="sourceCode" id="cb25"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb25-1"><a href="#cb25-1"></a></span>
497 <span id="cb25-2"><a href="#cb25-2"></a><span class="ex">java</span> -Dforeign.restricted=permit \</span>
498 <span id="cb25-3"><a href="#cb25-3"></a>    --add-modules jdk.incubator.foreign \</span>
499 <span id="cb25-4"><a href="#cb25-4"></a>    -Djava.library.path=/usr/lib LibprocMain.java</span></code></pre></div>
500 <h2 id="using-libgit2-from-java-mac-os">Using libgit2 from Java (Mac OS)</h2>
501 <h3 id="getting-and-building-libgit2">Getting and building libgit2</h3>
502 <ul>
503 <li>Download libgit2 v1.0.0 source from https://github.com/libgit2/libgit2/releases</li>
504 <li>Use cmake to build from libgit2</li>
505 <li>Let ${LIBGIT2_HOME} be the directory where you expanded libgit2 sources.</li>
506 <li>Let ${LIBGIT2_HOME}/build be the build directory where libgit2.dylib is built.</li>
507 </ul>
508 <h3 id="jextract-git2.h">jextract git2.h</h3>
509 <div class="sourceCode" id="cb26"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb26-1"><a href="#cb26-1"></a></span>
510 <span id="cb26-2"><a href="#cb26-2"></a><span class="ex">jextract</span> -t com.github -lgit2 \</span>
511 <span id="cb26-3"><a href="#cb26-3"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/ \</span>
512 <span id="cb26-4"><a href="#cb26-4"></a>  -I <span class="va">${LIBGIT2_HOME}</span>/include/ \</span>
513 <span id="cb26-5"><a href="#cb26-5"></a>  -I <span class="va">${LIBGIT2_HOME}</span>/include/git2 \</span>
514 <span id="cb26-6"><a href="#cb26-6"></a>  <span class="va">${LIBGIT2_HOME}</span>/include/git2.h</span></code></pre></div>
515 <h3 id="java-program-that-uses-libgit2-to-clone-github-repo">Java program that uses libgit2 to clone github repo</h3>
516 <div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb27-1"><a href="#cb27-1"></a></span>
517 <span id="cb27-2"><a href="#cb27-2"></a><span class="kw">import static</span><span class="im"> com.github.git2_h.*;</span></span>
518 <span id="cb27-3"><a href="#cb27-3"></a><span class="kw">import static</span><span class="im"> jdk.incubator.foreign.CSupport.*;</span></span>
519 <span id="cb27-4"><a href="#cb27-4"></a><span class="kw">import static</span><span class="im"> jdk.incubator.foreign.MemoryAddress.NULL;</span></span>
520 <span id="cb27-5"><a href="#cb27-5"></a><span class="kw">import static</span><span class="im"> jdk.incubator.foreign.NativeAllocationScope.*;</span></span>
521 <span id="cb27-6"><a href="#cb27-6"></a><span class="kw">import static</span><span class="im"> com.github.Cstring.*;</span></span>
522 <span id="cb27-7"><a href="#cb27-7"></a></span>
523 <span id="cb27-8"><a href="#cb27-8"></a><span class="kw">public</span> <span class="kw">class</span> GitClone {</span>
524 <span id="cb27-9"><a href="#cb27-9"></a>    <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</span>
525 <span id="cb27-10"><a href="#cb27-10"></a>          <span class="kw">if</span> (args.<span class="fu">length</span> != <span class="dv">2</span>) {</span>
526 <span id="cb27-11"><a href="#cb27-11"></a>              <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;java GitClone &lt;url&gt; &lt;path&gt;&quot;</span>);</span>
527 <span id="cb27-12"><a href="#cb27-12"></a>              <span class="bu">System</span>.<span class="fu">exit</span>(<span class="dv">1</span>);</span>
528 <span id="cb27-13"><a href="#cb27-13"></a>          }</span>
529 <span id="cb27-14"><a href="#cb27-14"></a>          <span class="fu">git_libgit2_init</span>();</span>
530 <span id="cb27-15"><a href="#cb27-15"></a>          <span class="kw">try</span> (var scope = <span class="fu">unboundedScope</span>()) {</span>
531 <span id="cb27-16"><a href="#cb27-16"></a>              var repo = scope.<span class="fu">allocate</span>(C_POINTER, NULL);</span>
532 <span id="cb27-17"><a href="#cb27-17"></a>              var url = <span class="fu">toCString</span>(args[<span class="dv">0</span>], scope);</span>
533 <span id="cb27-18"><a href="#cb27-18"></a>              var path = <span class="fu">toCString</span>(args[<span class="dv">1</span>], scope);</span>
534 <span id="cb27-19"><a href="#cb27-19"></a>              <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="fu">git_clone</span>(repo, url, path, NULL));</span>
535 <span id="cb27-20"><a href="#cb27-20"></a>          }</span>
536 <span id="cb27-21"><a href="#cb27-21"></a>          <span class="fu">git_libgit2_shutdown</span>();</span>
537 <span id="cb27-22"><a href="#cb27-22"></a>    }</span>
538 <span id="cb27-23"><a href="#cb27-23"></a>}</span></code></pre></div>
539 <h3 id="compiling-and-running-the-libgit2-sample">Compiling and running the libgit2 sample</h3>
540 <div class="sourceCode" id="cb28"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb28-1"><a href="#cb28-1"></a></span>
541 <span id="cb28-2"><a href="#cb28-2"></a><span class="co"># file run.sh</span></span>
542 <span id="cb28-3"><a href="#cb28-3"></a></span>
543 <span id="cb28-4"><a href="#cb28-4"></a><span class="ex">java</span> -Dforeign.restricted=permit --add-modules jdk.incubator.foreign \</span>
544 <span id="cb28-5"><a href="#cb28-5"></a>    -Djava.library.path=<span class="va">${LIBGIT2_HOME}</span>/build/ \</span>
545 <span id="cb28-6"><a href="#cb28-6"></a>    GitClone.java <span class="va">$*</span></span></code></pre></div>
546 <h3 id="cloning-a-github-repo-using-the-above-run.sh-command">Cloning a github repo using the above run.sh command</h3>
547 <div class="sourceCode" id="cb29"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb29-1"><a href="#cb29-1"></a></span>
548 <span id="cb29-2"><a href="#cb29-2"></a><span class="fu">sh</span> run.sh https://github.com/libgit2/libgit2.git libgit2</span></code></pre></div>
549 <h2 id="using-sqlite3-library-from-java-mac-os">Using sqlite3 library from Java (Mac OS)</h2>
550 <h3 id="jextract-sqlite3.h">jextract sqlite3.h</h3>
551 <div class="sourceCode" id="cb30"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb30-1"><a href="#cb30-1"></a></span>
552 <span id="cb30-2"><a href="#cb30-2"></a><span class="ex">jextract</span> \</span>
553 <span id="cb30-3"><a href="#cb30-3"></a>  -I /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include \</span>
554 <span id="cb30-4"><a href="#cb30-4"></a>  /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sqlite3.h \</span>
555 <span id="cb30-5"><a href="#cb30-5"></a>  -t org.sqlite -lsqlite3</span></code></pre></div>
556 <h3 id="java-program-that-uses-sqlite3">Java program that uses sqlite3</h3>
557 <div class="sourceCode" id="cb31"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb31-1"><a href="#cb31-1"></a></span>
558 <span id="cb31-2"><a href="#cb31-2"></a><span class="kw">import</span><span class="im"> org.sqlite.Cpointer;</span></span>
559 <span id="cb31-3"><a href="#cb31-3"></a><span class="kw">import</span><span class="im"> org.sqlite.Cstring;</span></span>
560 <span id="cb31-4"><a href="#cb31-4"></a><span class="kw">import</span><span class="im"> org.sqlite.RuntimeHelper.CScope;</span></span>
561 <span id="cb31-5"><a href="#cb31-5"></a><span class="kw">import static</span><span class="im"> jdk.incubator.foreign.MemoryAddress.NULL;</span></span>
562 <span id="cb31-6"><a href="#cb31-6"></a><span class="kw">import static</span><span class="im"> org.sqlite.sqlite3_h.*;</span></span>
563 <span id="cb31-7"><a href="#cb31-7"></a></span>
564 <span id="cb31-8"><a href="#cb31-8"></a><span class="kw">public</span> <span class="kw">class</span> SqliteMain {</span>
565 <span id="cb31-9"><a href="#cb31-9"></a>   <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) <span class="kw">throws</span> <span class="bu">Exception</span> {</span>
566 <span id="cb31-10"><a href="#cb31-10"></a>        <span class="kw">try</span> (var scope = <span class="kw">new</span> <span class="fu">CScope</span>()) {</span>
567 <span id="cb31-11"><a href="#cb31-11"></a>            <span class="co">// char** errMsgPtrPtr;</span></span>
568 <span id="cb31-12"><a href="#cb31-12"></a>            var errMsgPtrPtr = Cpointer.<span class="fu">allocate</span>(NULL, scope);</span>
569 <span id="cb31-13"><a href="#cb31-13"></a></span>
570 <span id="cb31-14"><a href="#cb31-14"></a>            <span class="co">// sqlite3** dbPtrPtr;</span></span>
571 <span id="cb31-15"><a href="#cb31-15"></a>            var dbPtrPtr = Cpointer.<span class="fu">allocate</span>(NULL, scope);</span>
572 <span id="cb31-16"><a href="#cb31-16"></a></span>
573 <span id="cb31-17"><a href="#cb31-17"></a>            <span class="dt">int</span> rc = <span class="fu">sqlite3_open</span>(Cstring.<span class="fu">toCString</span>(<span class="st">&quot;employee.db&quot;</span>,scope), dbPtrPtr);</span>
574 <span id="cb31-18"><a href="#cb31-18"></a>            <span class="kw">if</span> (rc != <span class="dv">0</span>) {</span>
575 <span id="cb31-19"><a href="#cb31-19"></a>                <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;sqlite3_open failed: &quot;</span> + rc);</span>
576 <span id="cb31-20"><a href="#cb31-20"></a>                <span class="kw">return</span>;</span>
577 <span id="cb31-21"><a href="#cb31-21"></a>            } <span class="kw">else</span> {</span>
578 <span id="cb31-22"><a href="#cb31-22"></a>                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;employee db opened&quot;</span>);</span>
579 <span id="cb31-23"><a href="#cb31-23"></a>            }</span>
580 <span id="cb31-24"><a href="#cb31-24"></a></span>
581 <span id="cb31-25"><a href="#cb31-25"></a>            <span class="co">// sqlite3* dbPtr;</span></span>
582 <span id="cb31-26"><a href="#cb31-26"></a>            var dbPtr = Cpointer.<span class="fu">get</span>(dbPtrPtr);</span>
583 <span id="cb31-27"><a href="#cb31-27"></a></span>
584 <span id="cb31-28"><a href="#cb31-28"></a>            <span class="co">// create a new table</span></span>
585 <span id="cb31-29"><a href="#cb31-29"></a>            var sql = Cstring.<span class="fu">toCString</span>(</span>
586 <span id="cb31-30"><a href="#cb31-30"></a>                <span class="st">&quot;CREATE TABLE EMPLOYEE (&quot;</span>  +</span>
587 <span id="cb31-31"><a href="#cb31-31"></a>                <span class="st">&quot;  ID INT PRIMARY KEY NOT NULL,&quot;</span> +</span>
588 <span id="cb31-32"><a href="#cb31-32"></a>                <span class="st">&quot;  NAME TEXT NOT NULL,&quot;</span>    +</span>
589 <span id="cb31-33"><a href="#cb31-33"></a>                <span class="st">&quot;  SALARY REAL NOT NULL )&quot;</span>, scope);</span>
590 <span id="cb31-34"><a href="#cb31-34"></a></span>
591 <span id="cb31-35"><a href="#cb31-35"></a>            rc = <span class="fu">sqlite3_exec</span>(dbPtr, sql, NULL, NULL, errMsgPtrPtr);</span>
592 <span id="cb31-36"><a href="#cb31-36"></a></span>
593 <span id="cb31-37"><a href="#cb31-37"></a>            <span class="kw">if</span> (rc != <span class="dv">0</span>) {</span>
594 <span id="cb31-38"><a href="#cb31-38"></a>                <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;sqlite3_exec failed: &quot;</span> + rc);</span>
595 <span id="cb31-39"><a href="#cb31-39"></a>                <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;SQL error: &quot;</span> + Cstring.<span class="fu">toJavaString</span>(Cpointer.<span class="fu">get</span>(errMsgPtrPtr)));</span>
596 <span id="cb31-40"><a href="#cb31-40"></a>                <span class="fu">sqlite3_free</span>(Cpointer.<span class="fu">get</span>(errMsgPtrPtr));</span>
597 <span id="cb31-41"><a href="#cb31-41"></a>            } <span class="kw">else</span> {</span>
598 <span id="cb31-42"><a href="#cb31-42"></a>                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;employee table created&quot;</span>);</span>
599 <span id="cb31-43"><a href="#cb31-43"></a>            }</span>
600 <span id="cb31-44"><a href="#cb31-44"></a></span>
601 <span id="cb31-45"><a href="#cb31-45"></a>            <span class="co">// insert two rows</span></span>
602 <span id="cb31-46"><a href="#cb31-46"></a>            sql = Cstring.<span class="fu">toCString</span>(</span>
603 <span id="cb31-47"><a href="#cb31-47"></a>                <span class="st">&quot;INSERT INTO EMPLOYEE (ID,NAME,SALARY) &quot;</span> +</span>
604 <span id="cb31-48"><a href="#cb31-48"></a>                    <span class="st">&quot;VALUES (134, &#39;Xyz&#39;, 200000.0); &quot;</span> +</span>
605 <span id="cb31-49"><a href="#cb31-49"></a>                <span class="st">&quot;INSERT INTO EMPLOYEE (ID,NAME,SALARY) &quot;</span> +</span>
606 <span id="cb31-50"><a href="#cb31-50"></a>                    <span class="st">&quot;VALUES (333, &#39;Abc&#39;, 100000.0);&quot;</span>, scope</span>
607 <span id="cb31-51"><a href="#cb31-51"></a>            );</span>
608 <span id="cb31-52"><a href="#cb31-52"></a>            rc = <span class="fu">sqlite3_exec</span>(dbPtr, sql, NULL, NULL, errMsgPtrPtr);</span>
609 <span id="cb31-53"><a href="#cb31-53"></a></span>
610 <span id="cb31-54"><a href="#cb31-54"></a>            <span class="kw">if</span> (rc != <span class="dv">0</span>) {</span>
611 <span id="cb31-55"><a href="#cb31-55"></a>                <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;sqlite3_exec failed: &quot;</span> + rc);</span>
612 <span id="cb31-56"><a href="#cb31-56"></a>                <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;SQL error: &quot;</span> + Cstring.<span class="fu">toJavaString</span>(Cpointer.<span class="fu">get</span>(errMsgPtrPtr)));</span>
613 <span id="cb31-57"><a href="#cb31-57"></a>                <span class="fu">sqlite3_free</span>(Cpointer.<span class="fu">get</span>(errMsgPtrPtr));</span>
614 <span id="cb31-58"><a href="#cb31-58"></a>            } <span class="kw">else</span> {</span>
615 <span id="cb31-59"><a href="#cb31-59"></a>                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;rows inserted&quot;</span>);</span>
616 <span id="cb31-60"><a href="#cb31-60"></a>            }</span>
617 <span id="cb31-61"><a href="#cb31-61"></a></span>
618 <span id="cb31-62"><a href="#cb31-62"></a>            <span class="dt">int</span>[] rowNum = <span class="kw">new</span> <span class="dt">int</span>[<span class="dv">1</span>];</span>
619 <span id="cb31-63"><a href="#cb31-63"></a>            <span class="co">// callback to print rows from SELECT query</span></span>
620 <span id="cb31-64"><a href="#cb31-64"></a>            var callback = sqlite3_exec$callback.<span class="fu">allocate</span>((a, argc, argv, columnNames) -&gt; {</span>
621 <span id="cb31-65"><a href="#cb31-65"></a>                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Row num: &quot;</span> + rowNum[<span class="dv">0</span>]++);</span>
622 <span id="cb31-66"><a href="#cb31-66"></a>                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;numColumns = &quot;</span> + argc);</span>
623 <span id="cb31-67"><a href="#cb31-67"></a>                argv = Cpointer.<span class="fu">asArray</span>(argv, argc);</span>
624 <span id="cb31-68"><a href="#cb31-68"></a>                columnNames = Cpointer.<span class="fu">asArray</span>(columnNames, argc);</span>
625 <span id="cb31-69"><a href="#cb31-69"></a>                <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; argc; i++) {</span>
626 <span id="cb31-70"><a href="#cb31-70"></a>                     <span class="bu">String</span> name = Cstring.<span class="fu">toJavaString</span>(Cpointer.<span class="fu">get</span>(columnNames, i));</span>
627 <span id="cb31-71"><a href="#cb31-71"></a>                     <span class="bu">String</span> value = Cstring.<span class="fu">toJavaString</span>(Cpointer.<span class="fu">get</span>(argv, i));</span>
628 <span id="cb31-72"><a href="#cb31-72"></a>                     <span class="bu">System</span>.<span class="fu">out.printf</span>(<span class="st">&quot;</span><span class="sc">%s</span><span class="st"> = </span><span class="sc">%s\n</span><span class="st">&quot;</span>, name, value);</span>
629 <span id="cb31-73"><a href="#cb31-73"></a>                }</span>
630 <span id="cb31-74"><a href="#cb31-74"></a>                <span class="kw">return</span> <span class="dv">0</span>;</span>
631 <span id="cb31-75"><a href="#cb31-75"></a>            });</span>
632 <span id="cb31-76"><a href="#cb31-76"></a>            scope.<span class="fu">register</span>(callback);</span>
633 <span id="cb31-77"><a href="#cb31-77"></a></span>
634 <span id="cb31-78"><a href="#cb31-78"></a>            <span class="co">// select query</span></span>
635 <span id="cb31-79"><a href="#cb31-79"></a>            sql = Cstring.<span class="fu">toCString</span>(<span class="st">&quot;SELECT * FROM EMPLOYEE&quot;</span>, scope);</span>
636 <span id="cb31-80"><a href="#cb31-80"></a>            rc = <span class="fu">sqlite3_exec</span>(dbPtr, sql, callback.<span class="fu">baseAddress</span>(), NULL, errMsgPtrPtr);</span>
637 <span id="cb31-81"><a href="#cb31-81"></a></span>
638 <span id="cb31-82"><a href="#cb31-82"></a>            <span class="kw">if</span> (rc != <span class="dv">0</span>) {</span>
639 <span id="cb31-83"><a href="#cb31-83"></a>                <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;sqlite3_exec failed: &quot;</span> + rc);</span>
640 <span id="cb31-84"><a href="#cb31-84"></a>                <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;SQL error: &quot;</span> + Cstring.<span class="fu">toJavaString</span>(Cpointer.<span class="fu">get</span>(errMsgPtrPtr)));</span>
641 <span id="cb31-85"><a href="#cb31-85"></a>                <span class="fu">sqlite3_free</span>(Cpointer.<span class="fu">get</span>(errMsgPtrPtr));</span>
642 <span id="cb31-86"><a href="#cb31-86"></a>            } <span class="kw">else</span> {</span>
643 <span id="cb31-87"><a href="#cb31-87"></a>                <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;done&quot;</span>);</span>
644 <span id="cb31-88"><a href="#cb31-88"></a>            }</span>
645 <span id="cb31-89"><a href="#cb31-89"></a></span>
646 <span id="cb31-90"><a href="#cb31-90"></a>            <span class="fu">sqlite3_close</span>(dbPtr);</span>
647 <span id="cb31-91"><a href="#cb31-91"></a>        }</span>
648 <span id="cb31-92"><a href="#cb31-92"></a>    }</span>
649 <span id="cb31-93"><a href="#cb31-93"></a>}</span></code></pre></div>
650 <h3 id="compiling-and-running-the-sqlite3-sample">Compiling and running the sqlite3 sample</h3>
651 <div class="sourceCode" id="cb32"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb32-1"><a href="#cb32-1"></a></span>
652 <span id="cb32-2"><a href="#cb32-2"></a><span class="ex">java</span> -Dforeign.restricted=permit \</span>
653 <span id="cb32-3"><a href="#cb32-3"></a>   --add-modules jdk.incubator.foreign \</span>
654 <span id="cb32-4"><a href="#cb32-4"></a>   -Djava.library.path=/usr/lib SqliteMain.java</span></code></pre></div>
655 </body>
656 </html>