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 "foreign" 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"><stdio.h></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">"helloworld.h"</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">"Hello World!</span><span class="sc">\n</span><span class="st">"</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 'header' 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">"print(sum([33, 55, 66])); print('Hello from Python!')</span><span class="sc">\n</span><span class="st">"</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">"name? "</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 "readline" 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 & 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">"Hello, "</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">"-D FORCE_OPENBLAS_COMPLEX_STRUCT"</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 < 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">" y</span><span class="sc">%d</span><span class="st"> = </span><span class="sc">%f\n</span><span class="st">"</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">"Entry Matrix A"</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">"Right Hand Side b"</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( "LAPACKE_dgels (col-major, high-level) Example Program Results\n" );</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">'N'</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">"Solution"</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">"</span><span class="sc">\n</span><span class="st"> </span><span class="sc">%s\n</span><span class="st">"</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 < 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 < n; j++ ) <span class="bu">System</span>.<span class="fu">out.printf</span>(<span class="st">" </span><span class="sc">%6.2f</span><span class="st">"</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">"</span><span class="sc">\n</span><span class="st">"</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 < 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">"</span><span class="sc">%d</span><span class="st"> </span><span class="sc">%s\n</span><span class="st">"</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">"java GitClone <url> <path>"</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">"employee.db"</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">"sqlite3_open failed: "</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">"employee db opened"</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">"CREATE TABLE EMPLOYEE ("</span> +</span> 587 <span id="cb31-31"><a href="#cb31-31"></a> <span class="st">" ID INT PRIMARY KEY NOT NULL,"</span> +</span> 588 <span id="cb31-32"><a href="#cb31-32"></a> <span class="st">" NAME TEXT NOT NULL,"</span> +</span> 589 <span id="cb31-33"><a href="#cb31-33"></a> <span class="st">" SALARY REAL NOT NULL )"</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">"sqlite3_exec failed: "</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">"SQL error: "</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">"employee table created"</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">"INSERT INTO EMPLOYEE (ID,NAME,SALARY) "</span> +</span> 604 <span id="cb31-48"><a href="#cb31-48"></a> <span class="st">"VALUES (134, 'Xyz', 200000.0); "</span> +</span> 605 <span id="cb31-49"><a href="#cb31-49"></a> <span class="st">"INSERT INTO EMPLOYEE (ID,NAME,SALARY) "</span> +</span> 606 <span id="cb31-50"><a href="#cb31-50"></a> <span class="st">"VALUES (333, 'Abc', 100000.0);"</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">"sqlite3_exec failed: "</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">"SQL error: "</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">"rows inserted"</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) -> {</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">"Row num: "</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">"numColumns = "</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 < 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">"</span><span class="sc">%s</span><span class="st"> = </span><span class="sc">%s\n</span><span class="st">"</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">"SELECT * FROM EMPLOYEE"</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">"sqlite3_exec failed: "</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">"SQL error: "</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">"done"</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>