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 type="text/css">
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 </style>
14 <style type="text/css">
15 a.sourceLine { display: inline-block; line-height: 1.25; }
16 a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
17 a.sourceLine:empty { height: 1.2em; }
18 .sourceCode { overflow: visible; }
19 code.sourceCode { white-space: pre; position: relative; }
20 div.sourceCode { margin: 1em 0; }
21 pre.sourceCode { margin: 0; }
22 @media screen {
23 div.sourceCode { overflow: auto; }
24 }
25 @media print {
26 code.sourceCode { white-space: pre-wrap; }
27 a.sourceLine { text-indent: -1em; padding-left: 1em; }
28 }
29 pre.numberSource a.sourceLine
30 { position: relative; left: -4em; }
31 pre.numberSource a.sourceLine::before
32 { content: attr(data-line-number);
33 position: relative; left: -1em; text-align: right; vertical-align: baseline;
34 border: none; pointer-events: all; display: inline-block;
35 -webkit-touch-callout: none; -webkit-user-select: none;
36 -khtml-user-select: none; -moz-user-select: none;
37 -ms-user-select: none; user-select: none;
38 padding: 0 4px; width: 4em;
39 color: #aaaaaa;
40 }
41 pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
42 div.sourceCode
43 { }
44 @media screen {
45 a.sourceLine::before { text-decoration: underline; }
46 }
47 code span.al { color: #ff0000; font-weight: bold; } /* Alert */
48 code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
49 code span.at { color: #7d9029; } /* Attribute */
50 code span.bn { color: #40a070; } /* BaseN */
51 code span.bu { } /* BuiltIn */
52 code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
53 code span.ch { color: #4070a0; } /* Char */
54 code span.cn { color: #880000; } /* Constant */
55 code span.co { color: #60a0b0; font-style: italic; } /* Comment */
56 code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
57 code span.do { color: #ba2121; font-style: italic; } /* Documentation */
58 code span.dt { color: #902000; } /* DataType */
59 code span.dv { color: #40a070; } /* DecVal */
60 code span.er { color: #ff0000; font-weight: bold; } /* Error */
61 code span.ex { } /* Extension */
62 code span.fl { color: #40a070; } /* Float */
63 code span.fu { color: #06287e; } /* Function */
64 code span.im { } /* Import */
65 code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
66 code span.kw { color: #007020; font-weight: bold; } /* Keyword */
67 code span.op { color: #666666; } /* Operator */
68 code span.ot { color: #007020; } /* Other */
69 code span.pp { color: #bc7a00; } /* Preprocessor */
70 code span.sc { color: #4070a0; } /* SpecialChar */
71 code span.ss { color: #bb6688; } /* SpecialString */
72 code span.st { color: #4070a0; } /* String */
73 code span.va { color: #19177c; } /* Variable */
74 code span.vs { color: #4070a0; } /* VerbatimString */
75 code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
76 </style>
77 <link rel="stylesheet" href="../make/data/docs-resources/resources/jdk-default.css" />
78 <!--[if lt IE 9]>
79 <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
80 <![endif]-->
81 </head>
82 <body>
83 <header>
84 <h1 class="title">Using Panama "foreign" JDK</h1>
85 </header>
86 <nav id="TOC">
87 <ul>
88 <li><a href="#using-panama-foreign-jdk">Using Panama "foreign" JDK</a><ul>
89 <li><a href="#windows-notes">Windows notes</a></li>
90 <li><a href="#embedding-python-interpreter-in-your-java-program-mac-os">Embedding Python interpreter in your Java program (Mac OS)</a><ul>
91 <li><a href="#jextract-a-jar-file-for-python.h">jextract a Jar file for Python.h</a></li>
92 <li><a href="#java-program-that-uses-extracted-python-interface">Java program that uses extracted Python interface</a></li>
93 <li><a href="#running-the-java-code-that-calls-python-interpreter">Running the Java code that calls Python interpreter</a></li>
94 </ul></li>
95 <li><a href="#jlinking-python-interpreter-in-your-jdk-mac-os">jlinking Python Interpreter in your JDK (Mac OS)</a><ul>
96 <li><a href="#generating-jmod-using-jextract">Generating jmod using jextract</a></li>
97 <li><a href="#jlinking-python-module-to-create-a-jdk-with-python-in-it">Jlinking python module to create a JDK with Python in it</a></li>
98 <li><a href="#compile-and-run-user-code-with-pythonjdk-jdk">Compile and run user code with "pythonjdk" jdk</a></li>
99 </ul></li>
100 <li><a href="#embedding-python-interpreter-in-your-java-program-ubuntu-16.04">Embedding Python interpreter in your Java program (Ubuntu 16.04)</a><ul>
101 <li><a href="#jextract-a-jar-file-for-python.h-1">jextract a Jar file for Python.h</a></li>
102 <li><a href="#compiling-and-running-python-java-example">Compiling and Running Python Java example</a></li>
103 </ul></li>
104 <li><a href="#embedding-python-interpreter-in-your-java-program-windows">Embedding Python interpreter in your Java program (Windows)</a><ul>
105 <li><a href="#jextract-a-jar-file-for-python.h-2">jextract a Jar file for Python.h</a></li>
106 <li><a href="#compiling-and-running-python-java-example-1">Compiling and Running Python Java example</a></li>
107 </ul></li>
108 <li><a href="#using-sqlite3-library-in-your-java-program-mac-os">Using sqlite3 library in your Java program (Mac OS)</a><ul>
109 <li><a href="#jextract-a-jar-file-for-sqlite3.h">jextract a jar file for sqlite3.h</a></li>
180 </ul></li>
181 </ul>
182 </nav>
183 <?xml version="1.0" encoding="utf-8"?>
184 <h1 id="using-panama-foreign-jdk">Using Panama "foreign" JDK</h1>
185 <p>There are two ways to get a panama foreign branch JDK.</p>
186 <ol type="1">
187 <li>Locally build "foreign" branch of panama repo <a href="http://hg.openjdk.java.net/panama/dev/" class="uri">http://hg.openjdk.java.net/panama/dev/</a></li>
188 <li>Download pre-built panama "foreign" early access binaries from <a href="http://jdk.java.net/panama/" class="uri">http://jdk.java.net/panama/</a></li>
189 </ol>
190 <p>Using foreign function call in Java involves the following three steps:</p>
191 <ol type="1">
192 <li>Use <strong>jextract</strong> tool to generate java interface for your C header file(s)</li>
193 <li>Use <strong>java.foreign</strong> API to create ("bind") implementation for C header interfaces</li>
194 <li>Invoke C functions via the jextracted Java interface</li>
195 </ol>
196 <h3 id="windows-notes">Windows notes</h3>
197 <p>You will (almost always) need to have Visual Studio installed, since most libraries indirectly depend on Visual Studio runtime libraries and this currently means that jextract needs their header to extract successfully. Windows examples have been tested with <a href="https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2017">Build Tools for Visual Studio 2017</a>.</p>
198 <p>It is generally a good idea to give jextract a bunch of extra memory since a lot of big system headers are transitively included. The extra memory will make the jextract run significantly faster. Windows support was added only recently, and the memory usage of jextract has not been optimized yet, so this is a workaround. You can give extra memory by passing e.g. <code>-J-Xmx8G</code> to jextract as an additional argument, which in this example gives jextract 8 gigabytes of memory.</p>
199 <p>Commands are tested in PowerShell.</p>
200 <h2 id="embedding-python-interpreter-in-your-java-program-mac-os">Embedding Python interpreter in your Java program (Mac OS)</h2>
201 <h3 id="jextract-a-jar-file-for-python.h">jextract a Jar file for Python.h</h3>
202 <div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb1-1" data-line-number="1"></a>
203 <a class="sourceLine" id="cb1-2" data-line-number="2"><span class="ex">jextract</span> -l python2.7 \</a>
204 <a class="sourceLine" id="cb1-3" data-line-number="3"> -L /System/Library/Frameworks/Python.framework/Versions/2.7/lib --record-library-path \</a>
205 <a class="sourceLine" id="cb1-4" data-line-number="4"> --exclude-symbols .*_FromFormatV<span class="dt">\|</span>_.*<span class="dt">\|</span>PyOS_vsnprintf<span class="dt">\|</span>.*_VaParse.*<span class="dt">\|</span>.*_VaBuild.*<span class="dt">\|</span>PyBuffer_SizeFromFormat<span class="dt">\|</span>vasprintf<span class="dt">\|</span>vfprintf<span class="dt">\|</span>vprintf<span class="dt">\|</span>vsprintf \</a>
206 <a class="sourceLine" id="cb1-5" data-line-number="5"> -t org.python \</a>
207 <a class="sourceLine" id="cb1-6" data-line-number="6"> /usr/include/python2.7/Python.h \</a>
208 <a class="sourceLine" id="cb1-7" data-line-number="7"> -o python.jar</a></code></pre></div>
209 <h3 id="java-program-that-uses-extracted-python-interface">Java program that uses extracted Python interface</h3>
210 <div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"></a>
211 <a class="sourceLine" id="cb2-2" data-line-number="2"><span class="co">// import java.foreign packages</span></a>
212 <a class="sourceLine" id="cb2-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.Libraries;</span></a>
213 <a class="sourceLine" id="cb2-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.foreign.Scope;</span></a>
214 <a class="sourceLine" id="cb2-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.foreign.memory.Pointer;</span></a>
215 <a class="sourceLine" id="cb2-6" data-line-number="6"></a>
216 <a class="sourceLine" id="cb2-7" data-line-number="7"><span class="co">// import jextracted python 'header' classes</span></a>
217 <a class="sourceLine" id="cb2-8" data-line-number="8"><span class="kw">import static</span><span class="im"> org.python.Python_lib.*;</span></a>
218 <a class="sourceLine" id="cb2-9" data-line-number="9"><span class="kw">import static</span><span class="im"> org.python.pythonrun_lib.*;</span></a>
219 <a class="sourceLine" id="cb2-10" data-line-number="10"></a>
220 <a class="sourceLine" id="cb2-11" data-line-number="11"><span class="kw">public</span> <span class="kw">class</span> PythonMain {</a>
221 <a class="sourceLine" id="cb2-12" data-line-number="12"> <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) {</a>
222 <a class="sourceLine" id="cb2-13" data-line-number="13"> <span class="fu">Py_Initialize</span>();</a>
223 <a class="sourceLine" id="cb2-14" data-line-number="14"> <span class="kw">try</span> (Scope s = org.<span class="fu">python</span>.<span class="fu">Python_lib</span>.<span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
224 <a class="sourceLine" id="cb2-15" data-line-number="15"> <span class="fu">PyRun_SimpleStringFlags</span>(s.<span class="fu">allocateCString</span>(</a>
225 <a class="sourceLine" id="cb2-16" data-line-number="16"> <span class="st">"print(sum([33, 55, 66])); print('Hello from Python!')</span><span class="sc">\n</span><span class="st">"</span>),</a>
226 <a class="sourceLine" id="cb2-17" data-line-number="17"> Pointer.<span class="fu">ofNull</span>());</a>
227 <a class="sourceLine" id="cb2-18" data-line-number="18"> }</a>
228 <a class="sourceLine" id="cb2-19" data-line-number="19"> <span class="fu">Py_Finalize</span>();</a>
229 <a class="sourceLine" id="cb2-20" data-line-number="20"> }</a>
230 <a class="sourceLine" id="cb2-21" data-line-number="21">}</a></code></pre></div>
231 <h3 id="running-the-java-code-that-calls-python-interpreter">Running the Java code that calls Python interpreter</h3>
232 <div class="sourceCode" id="cb3"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb3-1" data-line-number="1"></a>
233 <a class="sourceLine" id="cb3-2" data-line-number="2"><span class="ex">javac</span> -cp python.jar PythonMain.java</a>
234 <a class="sourceLine" id="cb3-3" data-line-number="3"></a>
235 <a class="sourceLine" id="cb3-4" data-line-number="4"><span class="ex">java</span> -cp python.jar:. PythonMain</a></code></pre></div>
236 <h2 id="jlinking-python-interpreter-in-your-jdk-mac-os">jlinking Python Interpreter in your JDK (Mac OS)</h2>
237 <h3 id="generating-jmod-using-jextract">Generating jmod using jextract</h3>
238 <div class="sourceCode" id="cb4"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb4-1" data-line-number="1"></a>
239 <a class="sourceLine" id="cb4-2" data-line-number="2"><span class="ex">jextract</span> -l python2.7 \</a>
240 <a class="sourceLine" id="cb4-3" data-line-number="3"> -L /System/Library/Frameworks/Python.framework/Versions/2.7/lib \</a>
241 <a class="sourceLine" id="cb4-4" data-line-number="4"> --exclude-symbols .*_FromFormatV<span class="dt">\|</span>_.*<span class="dt">\|</span>PyOS_vsnprintf<span class="dt">\|</span>.*_VaParse.*<span class="dt">\|</span>.*_VaBuild.*<span class="dt">\|</span>PyBuffer_SizeFromFormat<span class="dt">\|</span>vasprintf<span class="dt">\|</span>vfprintf<span class="dt">\|</span>vprintf<span class="dt">\|</span>vsprintf \</a>
242 <a class="sourceLine" id="cb4-5" data-line-number="5"> -t org.python \</a>
243 <a class="sourceLine" id="cb4-6" data-line-number="6"> /usr/include/python2.7/Python.h \</a>
244 <a class="sourceLine" id="cb4-7" data-line-number="7"> -o org.python.jmod</a></code></pre></div>
245 <h3 id="jlinking-python-module-to-create-a-jdk-with-python-in-it">Jlinking python module to create a JDK with Python in it</h3>
246 <p>jdk.compiler and org.python modules are added to the generated (jlinked) JDK</p>
247 <div class="sourceCode" id="cb5"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb5-1" data-line-number="1"></a>
248 <a class="sourceLine" id="cb5-2" data-line-number="2"><span class="ex">jlink</span> --add-modules org.python,jdk.compiler --module-path . --output pythonjdk</a></code></pre></div>
249 <h3 id="compile-and-run-user-code-with-pythonjdk-jdk">Compile and run user code with "pythonjdk" jdk</h3>
250 <p>In the following commands, it is assumed that you've put $pythonjdk/bin in your $PATH</p>
251 <div class="sourceCode" id="cb6"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb6-1" data-line-number="1"></a>
252 <a class="sourceLine" id="cb6-2" data-line-number="2"><span class="ex">javac</span> PythonMain.java</a>
253 <a class="sourceLine" id="cb6-3" data-line-number="3"><span class="ex">java</span> PythonMain</a></code></pre></div>
254 <h2 id="embedding-python-interpreter-in-your-java-program-ubuntu-16.04">Embedding Python interpreter in your Java program (Ubuntu 16.04)</h2>
255 <h3 id="jextract-a-jar-file-for-python.h-1">jextract a Jar file for Python.h</h3>
256 <div class="sourceCode" id="cb7"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb7-1" data-line-number="1"></a>
257 <a class="sourceLine" id="cb7-2" data-line-number="2"><span class="ex">jextract</span> -l python2.7 \</a>
258 <a class="sourceLine" id="cb7-3" data-line-number="3"> -L /usr/lib/python2.7/config-x86_64-linux-gnu --record-library-path \</a>
259 <a class="sourceLine" id="cb7-4" data-line-number="4"> --exclude-symbols .*_FromFormatV<span class="dt">\|</span>_.*<span class="dt">\|</span>PyOS_vsnprintf<span class="dt">\|</span>.*_VaParse.*<span class="dt">\|</span>.*_VaBuild.*<span class="dt">\|</span>PyBuffer_SizeFromFormat<span class="dt">\|</span>vasprintf<span class="dt">\|</span>vfprintf<span class="dt">\|</span>vprintf<span class="dt">\|</span>vsprintf \</a>
260 <a class="sourceLine" id="cb7-5" data-line-number="5"> -t org.python \</a>
261 <a class="sourceLine" id="cb7-6" data-line-number="6"> /usr/include/python2.7/Python.h \</a>
262 <a class="sourceLine" id="cb7-7" data-line-number="7"> -o python.jar</a></code></pre></div>
263 <h3 id="compiling-and-running-python-java-example">Compiling and Running Python Java example</h3>
264 <p>Follow the instructions from the Mac OS section</p>
265 <h2 id="embedding-python-interpreter-in-your-java-program-windows">Embedding Python interpreter in your Java program (Windows)</h2>
266 <h3 id="jextract-a-jar-file-for-python.h-2">jextract a Jar file for Python.h</h3>
267 <p>Where python 2.7 is installed in the <code>C:\Python27</code> directory:</p>
268 <div class="sourceCode" id="cb8"><pre class="sourceCode powershell"><code class="sourceCode powershell"><a class="sourceLine" id="cb8-1" data-line-number="1">jextract -L <span class="st">"C:\Windows\System32"</span> -l python27 -o python.<span class="fu">jar</span> -t <span class="st">"org.python"</span> --record-library-path C:\Python27\include\Python.<span class="fu">h</span></a></code></pre></div>
269 <h3 id="compiling-and-running-python-java-example-1">Compiling and Running Python Java example</h3>
270 <div class="sourceCode" id="cb9"><pre class="sourceCode powershell"><code class="sourceCode powershell"><a class="sourceLine" id="cb9-1" data-line-number="1">javac -cp python.<span class="fu">jar</span> PythonMain.<span class="fu">java</span></a>
271 <a class="sourceLine" id="cb9-2" data-line-number="2">java -cp <span class="st">"python.jar;."</span> PythonMain</a></code></pre></div>
272 <h2 id="using-sqlite3-library-in-your-java-program-mac-os">Using sqlite3 library in your Java program (Mac OS)</h2>
273 <h3 id="jextract-a-jar-file-for-sqlite3.h">jextract a jar file for sqlite3.h</h3>
274 <div class="sourceCode" id="cb10"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb10-1" data-line-number="1"></a>
275 <a class="sourceLine" id="cb10-2" data-line-number="2"><span class="ex">jextract</span> /usr/include/sqlite3.h -t org.sqlite -lsqlite3 \</a>
276 <a class="sourceLine" id="cb10-3" data-line-number="3"> -L /usr/lib --record-library-path \</a>
277 <a class="sourceLine" id="cb10-4" data-line-number="4"> --exclude-symbols sqlite3_vmprintf \</a>
278 <a class="sourceLine" id="cb10-5" data-line-number="5"> --exclude-symbols sqlite3_vsnprintf \</a>
279 <a class="sourceLine" id="cb10-6" data-line-number="6"> -o sqlite3.jar</a></code></pre></div>
280 <h3 id="java-sample-that-uses-sqlite3-library">Java sample that uses sqlite3 library</h3>
281 <div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"></a>
282 <a class="sourceLine" id="cb11-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.lang.invoke.*;</span></a>
283 <a class="sourceLine" id="cb11-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.*;</span></a>
284 <a class="sourceLine" id="cb11-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.foreign.memory.*;</span></a>
285 <a class="sourceLine" id="cb11-5" data-line-number="5"><span class="kw">import</span><span class="im"> org.sqlite.sqlite3_h.*;</span></a>
286 <a class="sourceLine" id="cb11-6" data-line-number="6"><span class="kw">import static</span><span class="im"> org.sqlite.sqlite3_lib.*;</span></a>
287 <a class="sourceLine" id="cb11-7" data-line-number="7"></a>
288 <a class="sourceLine" id="cb11-8" data-line-number="8"><span class="kw">public</span> <span class="kw">class</span> SqliteMain {</a>
289 <a class="sourceLine" id="cb11-9" data-line-number="9"> <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> {</a>
290 <a class="sourceLine" id="cb11-10" data-line-number="10"> <span class="kw">try</span> (Scope scope = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
291 <a class="sourceLine" id="cb11-11" data-line-number="11"> <span class="co">// char* errMsg;</span></a>
292 <a class="sourceLine" id="cb11-12" data-line-number="12"> Pointer<Pointer<<span class="bu">Byte</span>>> errMsg = scope.<span class="fu">allocate</span>(NativeTypes.<span class="fu">INT8</span>.<span class="fu">pointer</span>());</a>
293 <a class="sourceLine" id="cb11-13" data-line-number="13"></a>
294 <a class="sourceLine" id="cb11-14" data-line-number="14"> <span class="co">// sqlite3* db;</span></a>
295 <a class="sourceLine" id="cb11-15" data-line-number="15"> Pointer<Pointer<sqlite3>> db = scope.<span class="fu">allocate</span>(LayoutType.<span class="fu">ofStruct</span>(sqlite3.<span class="fu">class</span>).<span class="fu">pointer</span>());</a>
296 <a class="sourceLine" id="cb11-16" data-line-number="16"></a>
297 <a class="sourceLine" id="cb11-17" data-line-number="17"> <span class="dt">int</span> rc = <span class="fu">sqlite3_open</span>(scope.<span class="fu">allocateCString</span>(<span class="st">"employee.db"</span>), db);</a>
298 <a class="sourceLine" id="cb11-18" data-line-number="18"> <span class="kw">if</span> (rc != <span class="dv">0</span>) {</a>
299 <a class="sourceLine" id="cb11-19" data-line-number="19"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_open failed: "</span> + rc);</a>
300 <a class="sourceLine" id="cb11-20" data-line-number="20"> <span class="kw">return</span>;</a>
301 <a class="sourceLine" id="cb11-21" data-line-number="21"> }</a>
302 <a class="sourceLine" id="cb11-22" data-line-number="22"></a>
303 <a class="sourceLine" id="cb11-23" data-line-number="23"> <span class="co">// create a new table</span></a>
304 <a class="sourceLine" id="cb11-24" data-line-number="24"> Pointer<<span class="bu">Byte</span>> sql = scope.<span class="fu">allocateCString</span>(</a>
305 <a class="sourceLine" id="cb11-25" data-line-number="25"> <span class="st">"CREATE TABLE EMPLOYEE ("</span> +</a>
306 <a class="sourceLine" id="cb11-26" data-line-number="26"> <span class="st">" ID INT PRIMARY KEY NOT NULL,"</span> +</a>
307 <a class="sourceLine" id="cb11-27" data-line-number="27"> <span class="st">" NAME TEXT NOT NULL,"</span> +</a>
308 <a class="sourceLine" id="cb11-28" data-line-number="28"> <span class="st">" SALARY REAL NOT NULL )"</span></a>
309 <a class="sourceLine" id="cb11-29" data-line-number="29"> );</a>
310 <a class="sourceLine" id="cb11-30" data-line-number="30"></a>
311 <a class="sourceLine" id="cb11-31" data-line-number="31"> rc = <span class="fu">sqlite3_exec</span>(db.<span class="fu">get</span>(), sql, <span class="bu">Callback</span>.<span class="fu">ofNull</span>(), Pointer.<span class="fu">ofNull</span>(), errMsg);</a>
312 <a class="sourceLine" id="cb11-32" data-line-number="32"></a>
313 <a class="sourceLine" id="cb11-33" data-line-number="33"> <span class="kw">if</span> (rc != <span class="dv">0</span>) {</a>
314 <a class="sourceLine" id="cb11-34" data-line-number="34"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_exec failed: "</span> + rc);</a>
315 <a class="sourceLine" id="cb11-35" data-line-number="35"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"SQL error: "</span> + Pointer.<span class="fu">toString</span>(errMsg.<span class="fu">get</span>()));</a>
316 <a class="sourceLine" id="cb11-36" data-line-number="36"> <span class="fu">sqlite3_free</span>(errMsg.<span class="fu">get</span>());</a>
317 <a class="sourceLine" id="cb11-37" data-line-number="37"> }</a>
318 <a class="sourceLine" id="cb11-38" data-line-number="38"></a>
319 <a class="sourceLine" id="cb11-39" data-line-number="39"> <span class="co">// insert two rows</span></a>
320 <a class="sourceLine" id="cb11-40" data-line-number="40"> sql = scope.<span class="fu">allocateCString</span>(</a>
321 <a class="sourceLine" id="cb11-41" data-line-number="41"> <span class="st">"INSERT INTO EMPLOYEE (ID,NAME,SALARY) "</span> +</a>
322 <a class="sourceLine" id="cb11-42" data-line-number="42"> <span class="st">"VALUES (134, 'Xyz', 200000.0); "</span> +</a>
323 <a class="sourceLine" id="cb11-43" data-line-number="43"> <span class="st">"INSERT INTO EMPLOYEE (ID,NAME,SALARY) "</span> +</a>
324 <a class="sourceLine" id="cb11-44" data-line-number="44"> <span class="st">"VALUES (333, 'Abc', 100000.0);"</span></a>
325 <a class="sourceLine" id="cb11-45" data-line-number="45"> );</a>
326 <a class="sourceLine" id="cb11-46" data-line-number="46"> rc = <span class="fu">sqlite3_exec</span>(db.<span class="fu">get</span>(), sql, <span class="bu">Callback</span>.<span class="fu">ofNull</span>(), Pointer.<span class="fu">ofNull</span>(), errMsg);</a>
327 <a class="sourceLine" id="cb11-47" data-line-number="47"></a>
328 <a class="sourceLine" id="cb11-48" data-line-number="48"> <span class="kw">if</span> (rc != <span class="dv">0</span>) {</a>
329 <a class="sourceLine" id="cb11-49" data-line-number="49"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_exec failed: "</span> + rc);</a>
330 <a class="sourceLine" id="cb11-50" data-line-number="50"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"SQL error: "</span> + Pointer.<span class="fu">toString</span>(errMsg.<span class="fu">get</span>()));</a>
331 <a class="sourceLine" id="cb11-51" data-line-number="51"> <span class="fu">sqlite3_free</span>(errMsg.<span class="fu">get</span>());</a>
332 <a class="sourceLine" id="cb11-52" data-line-number="52"> }</a>
333 <a class="sourceLine" id="cb11-53" data-line-number="53"></a>
334 <a class="sourceLine" id="cb11-54" data-line-number="54"> <span class="dt">int</span>[] rowNum = <span class="kw">new</span> <span class="dt">int</span>[<span class="dv">1</span>];</a>
335 <a class="sourceLine" id="cb11-55" data-line-number="55"> <span class="co">// callback to print rows from SELECT query</span></a>
336 <a class="sourceLine" id="cb11-56" data-line-number="56"> <span class="bu">Callback</span><FI1> callback = scope.<span class="fu">allocateCallback</span>(FI1.<span class="fu">class</span>, (a, argc, argv, columnNames) -> {</a>
337 <a class="sourceLine" id="cb11-57" data-line-number="57"> <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>]++);</a>
338 <a class="sourceLine" id="cb11-58" data-line-number="58"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"numColumns = "</span> + argc);</a>
339 <a class="sourceLine" id="cb11-59" data-line-number="59"> <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i < argc; i++) {</a>
340 <a class="sourceLine" id="cb11-60" data-line-number="60"> <span class="bu">String</span> name = Pointer.<span class="fu">toString</span>(columnNames.<span class="fu">offset</span>(i).<span class="fu">get</span>());</a>
341 <a class="sourceLine" id="cb11-61" data-line-number="61"> <span class="bu">String</span> value = Pointer.<span class="fu">toString</span>(argv.<span class="fu">offset</span>(i).<span class="fu">get</span>());</a>
342 <a class="sourceLine" id="cb11-62" data-line-number="62"> <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);</a>
343 <a class="sourceLine" id="cb11-63" data-line-number="63"> }</a>
344 <a class="sourceLine" id="cb11-64" data-line-number="64"> <span class="kw">return</span> <span class="dv">0</span>;</a>
345 <a class="sourceLine" id="cb11-65" data-line-number="65"> });</a>
346 <a class="sourceLine" id="cb11-66" data-line-number="66"></a>
347 <a class="sourceLine" id="cb11-67" data-line-number="67"> <span class="co">// select query</span></a>
348 <a class="sourceLine" id="cb11-68" data-line-number="68"> sql = scope.<span class="fu">allocateCString</span>(<span class="st">"SELECT * FROM EMPLOYEE"</span>);</a>
349 <a class="sourceLine" id="cb11-69" data-line-number="69"> rc = <span class="fu">sqlite3_exec</span>(db.<span class="fu">get</span>(), sql, callback, Pointer.<span class="fu">ofNull</span>(), errMsg);</a>
350 <a class="sourceLine" id="cb11-70" data-line-number="70"></a>
351 <a class="sourceLine" id="cb11-71" data-line-number="71"> <span class="kw">if</span> (rc != <span class="dv">0</span>) {</a>
352 <a class="sourceLine" id="cb11-72" data-line-number="72"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_exec failed: "</span> + rc);</a>
353 <a class="sourceLine" id="cb11-73" data-line-number="73"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"SQL error: "</span> + Pointer.<span class="fu">toString</span>(errMsg.<span class="fu">get</span>()));</a>
354 <a class="sourceLine" id="cb11-74" data-line-number="74"> <span class="fu">sqlite3_free</span>(errMsg.<span class="fu">get</span>());</a>
355 <a class="sourceLine" id="cb11-75" data-line-number="75"> }</a>
356 <a class="sourceLine" id="cb11-76" data-line-number="76"> </a>
357 <a class="sourceLine" id="cb11-77" data-line-number="77"> <span class="fu">sqlite3_close</span>(db.<span class="fu">get</span>());</a>
358 <a class="sourceLine" id="cb11-78" data-line-number="78"> }</a>
359 <a class="sourceLine" id="cb11-79" data-line-number="79"> }</a>
360 <a class="sourceLine" id="cb11-80" data-line-number="80">}</a></code></pre></div>
361 <h3 id="compiling-and-running-sqlite-java-example">Compiling and Running sqlite Java example</h3>
362 <div class="sourceCode" id="cb12"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb12-1" data-line-number="1"></a>
363 <a class="sourceLine" id="cb12-2" data-line-number="2"><span class="ex">javac</span> -cp sqlite3.jar SqlMain.java</a>
364 <a class="sourceLine" id="cb12-3" data-line-number="3"><span class="ex">java</span> -cp sqlite3.jar:. SqlMain</a></code></pre></div>
365 <h2 id="using-sqlite3-library-in-your-java-program-ubuntu-16.04">Using sqlite3 library in your Java program (Ubuntu 16.04)</h2>
366 <h3 id="installing-sqlite3">Installing sqlite3</h3>
367 <p>On Ubuntu (16.04) to install sqlite3 headers and libraries the following command is required:</p>
368 <div class="sourceCode" id="cb13"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="fu">sudo</span> apt-get install libsqlite3-dev</a></code></pre></div>
369 <p>This should install the sqlite3 header (under <code>/usr/include</code>), as well as the sqlite3 shared library (under <code>/usr/lib/x86_64-linux-gnu</code>).</p>
370 <h3 id="jextract-a-jar-file-for-sqlite3.h-1">jextract a jar file for sqlite3.h</h3>
371 <p>To extract sqlite, run the following command:</p>
372 <div class="sourceCode" id="cb14"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="ex">jextract</span> /usr/include/sqlite3.h -t org.sqlite -lsqlite3 \</a>
373 <a class="sourceLine" id="cb14-2" data-line-number="2"> -L /usr/lib/x86_64-linux-gnu --record-library-path \</a>
374 <a class="sourceLine" id="cb14-3" data-line-number="3"> --exclude-symbols sqlite3_vmprintf \</a>
375 <a class="sourceLine" id="cb14-4" data-line-number="4"> --exclude-symbols sqlite3_vsnprintf \</a>
376 <a class="sourceLine" id="cb14-5" data-line-number="5"> -o sqlite3.jar</a></code></pre></div>
377 <h3 id="compiling-and-running-sqlite-java-example-1">Compiling and Running sqlite Java example</h3>
378 <p>Please refer to the Mac OS instructions; once the library as been extracted (as per the instructions above), the sample program shown in that section should work on Ubuntu as well.</p>
379 <h2 id="using-blas-library">Using BLAS library</h2>
380 <p>BLAS is a popular library that allows fast matrix and vector computation: <a href="http://www.netlib.org/blas/" class="uri">http://www.netlib.org/blas/</a>.</p>
381 <h3 id="installing-openblas-mac-os">Installing OpenBLAS (Mac OS)</h3>
382 <p>On Mac, blas is available as part of the OpenBLAS library: <a href="https://github.com/xianyi/OpenBLAS/wiki" class="uri">https://github.com/xianyi/OpenBLAS/wiki</a></p>
383 <p>OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.</p>
384 <p>You can install openblas using HomeBrew</p>
385 <div class="sourceCode" id="cb15"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb15-1" data-line-number="1"></a>
386 <a class="sourceLine" id="cb15-2" data-line-number="2"><span class="ex">brew</span> install openblas</a></code></pre></div>
387 <p>It installs include and lib directories under /usr/local/opt/openblas</p>
388 <h3 id="installing-openblas-ubuntu-16.04">Installing OpenBLAS (Ubuntu 16.04)</h3>
389 <p>On Ubuntu, blas is distributed as part of the atlas library: <a href="http://math-atlas.sourceforge.net/" class="uri">http://math-atlas.sourceforge.net/</a>.</p>
390 <p>You can install atlas using apt</p>
391 <div class="sourceCode" id="cb16"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb16-1" data-line-number="1"></a>
392 <a class="sourceLine" id="cb16-2" data-line-number="2"><span class="fu">sudo</span> apt-get install libatlas-base-dev</a></code></pre></div>
393 <p>This command will install include files under <code>/usr/include/atlas</code> and corresponding libraries under <code>/usr/lib/atlas-dev</code>.</p>
394 <h3 id="jextracting-cblas.h-macos">jextracting cblas.h (MacOS)</h3>
395 <p>The following command can be used to extract cblas.h on MacOs</p>
396 <div class="sourceCode" id="cb17"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb17-1" data-line-number="1"></a>
397 <a class="sourceLine" id="cb17-2" data-line-number="2"><span class="ex">jextract</span> -C <span class="st">"-D FORCE_OPENBLAS_COMPLEX_STRUCT"</span> \</a>
398 <a class="sourceLine" id="cb17-3" data-line-number="3"> -L /usr/local/opt/openblas/lib \</a>
399 <a class="sourceLine" id="cb17-4" data-line-number="4"> -l openblas -t blas --record-library-path /usr/local/opt/openblas/include/cblas.h \</a>
400 <a class="sourceLine" id="cb17-5" data-line-number="5"> -o cblas.jar</a></code></pre></div>
401 <p>The FORCE_OPENBLAS_COMPLEX_STRUCT define is needed because jextract does not yet handle C99 <code>_Complex</code> types. The rest of the options are standard ones.</p>
402 <h3 id="jextracting-cblas.h-ubuntu-16.04">jextracting cblas.h (Ubuntu 16.04)</h3>
403 <p>The following command can be used to extract cblas.h on Ubuntu</p>
404 <div class="sourceCode" id="cb18"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb18-1" data-line-number="1"></a>
405 <a class="sourceLine" id="cb18-2" data-line-number="2"><span class="ex">jextract</span> -L /usr/lib/atlas-base -I /usr/include/atlas/ \</a>
406 <a class="sourceLine" id="cb18-3" data-line-number="3"> -l cblas -t blas --record-library-path \</a>
407 <a class="sourceLine" id="cb18-4" data-line-number="4"> /usr/include/atlas/cblas.h -o cblas.jar</a></code></pre></div>
408 <h3 id="java-sample-code-that-uses-cblas-library">Java sample code that uses cblas library</h3>
409 <div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1"></a>
410 <a class="sourceLine" id="cb19-2" data-line-number="2"><span class="kw">import</span><span class="im"> blas.cblas_h;</span></a>
411 <a class="sourceLine" id="cb19-3" data-line-number="3"><span class="kw">import static</span><span class="im"> blas.cblas_lib.*;</span></a>
412 <a class="sourceLine" id="cb19-4" data-line-number="4"><span class="kw">import static</span><span class="im"> blas.cblas_lib.CBLAS_ORDER.*;</span></a>
413 <a class="sourceLine" id="cb19-5" data-line-number="5"><span class="kw">import static</span><span class="im"> blas.cblas_lib.CBLAS_TRANSPOSE.*;</span></a>
414 <a class="sourceLine" id="cb19-6" data-line-number="6"></a>
415 <a class="sourceLine" id="cb19-7" data-line-number="7"><span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span></a>
416 <a class="sourceLine" id="cb19-8" data-line-number="8"><span class="kw">import</span><span class="im"> java.foreign.Scope;</span></a>
417 <a class="sourceLine" id="cb19-9" data-line-number="9"><span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span></a>
418 <a class="sourceLine" id="cb19-10" data-line-number="10"></a>
419 <a class="sourceLine" id="cb19-11" data-line-number="11"><span class="kw">public</span> <span class="kw">class</span> TestBlas {</a>
420 <a class="sourceLine" id="cb19-12" data-line-number="12"> <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) {</a>
421 <a class="sourceLine" id="cb19-13" data-line-number="13"> <span class="at">@cblas_h</span>.<span class="fu">CBLAS_ORDER</span> <span class="dt">int</span> Layout;</a>
422 <a class="sourceLine" id="cb19-14" data-line-number="14"> <span class="at">@cblas_h</span>.<span class="fu">CBLAS_TRANSPOSE</span> <span class="dt">int</span> transa;</a>
423 <a class="sourceLine" id="cb19-15" data-line-number="15"></a>
424 <a class="sourceLine" id="cb19-16" data-line-number="16"> <span class="dt">double</span> alpha, beta;</a>
425 <a class="sourceLine" id="cb19-17" data-line-number="17"> <span class="dt">int</span> m, n, lda, incx, incy, i;</a>
426 <a class="sourceLine" id="cb19-18" data-line-number="18"></a>
427 <a class="sourceLine" id="cb19-19" data-line-number="19"> Layout = CblasColMajor;</a>
428 <a class="sourceLine" id="cb19-20" data-line-number="20"> transa = CblasNoTrans;</a>
429 <a class="sourceLine" id="cb19-21" data-line-number="21"></a>
430 <a class="sourceLine" id="cb19-22" data-line-number="22"> m = <span class="dv">4</span>; <span class="co">/* Size of Column ( the number of rows ) */</span></a>
431 <a class="sourceLine" id="cb19-23" data-line-number="23"> n = <span class="dv">4</span>; <span class="co">/* Size of Row ( the number of columns ) */</span></a>
432 <a class="sourceLine" id="cb19-24" data-line-number="24"> lda = <span class="dv">4</span>; <span class="co">/* Leading dimension of 5 * 4 matrix is 5 */</span></a>
433 <a class="sourceLine" id="cb19-25" data-line-number="25"> incx = <span class="dv">1</span>;</a>
434 <a class="sourceLine" id="cb19-26" data-line-number="26"> incy = <span class="dv">1</span>;</a>
435 <a class="sourceLine" id="cb19-27" data-line-number="27"> alpha = <span class="dv">1</span>;</a>
436 <a class="sourceLine" id="cb19-28" data-line-number="28"> beta = <span class="dv">0</span>;</a>
437 <a class="sourceLine" id="cb19-29" data-line-number="29"></a>
438 <a class="sourceLine" id="cb19-30" data-line-number="30"> <span class="kw">try</span> (Scope sc = <span class="fu">scope</span>().<span class="fu">fork</span>()){</a>
439 <a class="sourceLine" id="cb19-31" data-line-number="31"> <span class="bu">Array</span><<span class="bu">Double</span>> a = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, m * n);</a>
440 <a class="sourceLine" id="cb19-32" data-line-number="32"> <span class="bu">Array</span><<span class="bu">Double</span>> x = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, n);</a>
441 <a class="sourceLine" id="cb19-33" data-line-number="33"> <span class="bu">Array</span><<span class="bu">Double</span>> y = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, n);</a>
442 <a class="sourceLine" id="cb19-34" data-line-number="34"> <span class="co">/* The elements of the first column */</span></a>
443 <a class="sourceLine" id="cb19-35" data-line-number="35"> a.<span class="fu">set</span>(<span class="dv">0</span>, <span class="fl">1.0</span>);</a>
444 <a class="sourceLine" id="cb19-36" data-line-number="36"> a.<span class="fu">set</span>(<span class="dv">1</span>, <span class="fl">2.0</span>);</a>
445 <a class="sourceLine" id="cb19-37" data-line-number="37"> a.<span class="fu">set</span>(<span class="dv">2</span>, <span class="fl">3.0</span>);</a>
446 <a class="sourceLine" id="cb19-38" data-line-number="38"> a.<span class="fu">set</span>(<span class="dv">3</span>, <span class="fl">4.0</span>);</a>
447 <a class="sourceLine" id="cb19-39" data-line-number="39"> <span class="co">/* The elements of the second column */</span></a>
448 <a class="sourceLine" id="cb19-40" data-line-number="40"> a.<span class="fu">set</span>(m, <span class="fl">1.0</span>);</a>
449 <a class="sourceLine" id="cb19-41" data-line-number="41"> a.<span class="fu">set</span>(m + <span class="dv">1</span>, <span class="fl">1.0</span>);</a>
450 <a class="sourceLine" id="cb19-42" data-line-number="42"> a.<span class="fu">set</span>(m + <span class="dv">2</span>, <span class="fl">1.0</span>);</a>
451 <a class="sourceLine" id="cb19-43" data-line-number="43"> a.<span class="fu">set</span>(m + <span class="dv">3</span>, <span class="fl">1.0</span>);</a>
452 <a class="sourceLine" id="cb19-44" data-line-number="44"> <span class="co">/* The elements of the third column */</span></a>
453 <a class="sourceLine" id="cb19-45" data-line-number="45"> a.<span class="fu">set</span>(m * <span class="dv">2</span>, <span class="fl">3.0</span>);</a>
454 <a class="sourceLine" id="cb19-46" data-line-number="46"> a.<span class="fu">set</span>(m * <span class="dv">2</span> + <span class="dv">1</span>, <span class="fl">4.0</span>);</a>
455 <a class="sourceLine" id="cb19-47" data-line-number="47"> a.<span class="fu">set</span>(m * <span class="dv">2</span> + <span class="dv">2</span>, <span class="fl">5.0</span>);</a>
456 <a class="sourceLine" id="cb19-48" data-line-number="48"> a.<span class="fu">set</span>(m * <span class="dv">2</span> + <span class="dv">3</span>, <span class="fl">6.0</span>);</a>
457 <a class="sourceLine" id="cb19-49" data-line-number="49"> <span class="co">/* The elements of the fourth column */</span></a>
458 <a class="sourceLine" id="cb19-50" data-line-number="50"> a.<span class="fu">set</span>(m * <span class="dv">3</span>, <span class="fl">5.0</span>);</a>
459 <a class="sourceLine" id="cb19-51" data-line-number="51"> a.<span class="fu">set</span>(m * <span class="dv">3</span> + <span class="dv">1</span>, <span class="fl">6.0</span>);</a>
460 <a class="sourceLine" id="cb19-52" data-line-number="52"> a.<span class="fu">set</span>(m * <span class="dv">3</span> + <span class="dv">2</span>, <span class="fl">7.0</span>);</a>
461 <a class="sourceLine" id="cb19-53" data-line-number="53"> a.<span class="fu">set</span>(m * <span class="dv">3</span> + <span class="dv">3</span>, <span class="fl">8.0</span>);</a>
462 <a class="sourceLine" id="cb19-54" data-line-number="54"> <span class="co">/* The elemetns of x and y */</span></a>
463 <a class="sourceLine" id="cb19-55" data-line-number="55"> x.<span class="fu">set</span>(<span class="dv">0</span>, <span class="fl">1.0</span>);</a>
464 <a class="sourceLine" id="cb19-56" data-line-number="56"> x.<span class="fu">set</span>(<span class="dv">1</span>, <span class="fl">2.0</span>);</a>
465 <a class="sourceLine" id="cb19-57" data-line-number="57"> x.<span class="fu">set</span>(<span class="dv">2</span>, <span class="fl">1.0</span>);</a>
466 <a class="sourceLine" id="cb19-58" data-line-number="58"> x.<span class="fu">set</span>(<span class="dv">3</span>, <span class="fl">1.0</span>);</a>
467 <a class="sourceLine" id="cb19-59" data-line-number="59"> y.<span class="fu">set</span>(<span class="dv">0</span>, <span class="fl">0.0</span>);</a>
468 <a class="sourceLine" id="cb19-60" data-line-number="60"> y.<span class="fu">set</span>(<span class="dv">1</span>, <span class="fl">0.0</span>);</a>
469 <a class="sourceLine" id="cb19-61" data-line-number="61"> y.<span class="fu">set</span>(<span class="dv">2</span>, <span class="fl">0.0</span>);</a>
470 <a class="sourceLine" id="cb19-62" data-line-number="62"> y.<span class="fu">set</span>(<span class="dv">3</span>, <span class="fl">0.0</span>);</a>
471 <a class="sourceLine" id="cb19-63" data-line-number="63"></a>
472 <a class="sourceLine" id="cb19-64" data-line-number="64"> <span class="fu">cblas_dgemv</span>(Layout, transa, m, n, alpha, a.<span class="fu">elementPointer</span>(), lda, x.<span class="fu">elementPointer</span>(), incx, beta,</a>
473 <a class="sourceLine" id="cb19-65" data-line-number="65"> y.<span class="fu">elementPointer</span>(), incy);</a>
474 <a class="sourceLine" id="cb19-66" data-line-number="66"> <span class="co">/* Print y */</span></a>
475 <a class="sourceLine" id="cb19-67" data-line-number="67"> <span class="kw">for</span> (i = <span class="dv">0</span>; i < n; i++)</a>
476 <a class="sourceLine" id="cb19-68" data-line-number="68"> <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, y.<span class="fu">get</span>(i)));</a>
477 <a class="sourceLine" id="cb19-69" data-line-number="69"> }</a>
478 <a class="sourceLine" id="cb19-70" data-line-number="70"> }</a>
479 <a class="sourceLine" id="cb19-71" data-line-number="71">}</a></code></pre></div>
480 <h3 id="compiling-and-running-the-above-cblas-samples">Compiling and running the above cblas samples</h3>
481 <div class="sourceCode" id="cb20"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb20-1" data-line-number="1"></a>
482 <a class="sourceLine" id="cb20-2" data-line-number="2"><span class="ex">javac</span> -cp cblas.jar TestBlas.java</a>
483 <a class="sourceLine" id="cb20-3" data-line-number="3"></a>
484 <a class="sourceLine" id="cb20-4" data-line-number="4"><span class="ex">java</span> -cp cblas.jar:. TestBlas</a></code></pre></div>
485 <h2 id="using-lapack-library-ubuntu">Using LAPACK library (Ubuntu)</h2>
486 <p>On Ubuntu, the same steps used to install the blas (via atlas) library also install headers and libraries for the LAPACK library, a linear algebra computation library built on top of blas.</p>
487 <h3 id="jextracting-clapack.h-ubuntu-16.04">jextracting clapack.h (Ubuntu 16.04)</h3>
488 <p>The following command can be used to extract the LAPACK header:</p>
489 <div class="sourceCode" id="cb21"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb21-1" data-line-number="1"></a>
490 <a class="sourceLine" id="cb21-2" data-line-number="2"><span class="ex">jextract</span> -L /usr/lib/atlas-base/atlas -I /usr/include/atlas/ \</a>
491 <a class="sourceLine" id="cb21-3" data-line-number="3"> -l lapack -t lapack --record-library-path /usr/include/atlas/clapack.h -o clapack.jar</a></code></pre></div>
492 <h3 id="java-sample-code-that-uses-lapack-library">Java sample code that uses LAPACK library</h3>
493 <div class="sourceCode" id="cb22"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb22-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span></a>
494 <a class="sourceLine" id="cb22-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.foreign.Scope;</span></a>
495 <a class="sourceLine" id="cb22-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span></a>
496 <a class="sourceLine" id="cb22-4" data-line-number="4"></a>
497 <a class="sourceLine" id="cb22-5" data-line-number="5"><span class="kw">import static</span><span class="im"> lapack.clapack_lib.*;</span></a>
498 <a class="sourceLine" id="cb22-6" data-line-number="6"><span class="kw">import static</span><span class="im"> lapack.cblas_lib.*;</span></a>
499 <a class="sourceLine" id="cb22-7" data-line-number="7"></a>
500 <a class="sourceLine" id="cb22-8" data-line-number="8"><span class="kw">public</span> <span class="kw">class</span> TestLapack {</a>
501 <a class="sourceLine" id="cb22-9" data-line-number="9"> <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) {</a>
502 <a class="sourceLine" id="cb22-10" data-line-number="10"></a>
503 <a class="sourceLine" id="cb22-11" data-line-number="11"> <span class="co">/* Locals */</span></a>
504 <a class="sourceLine" id="cb22-12" data-line-number="12"> <span class="kw">try</span> (Scope sc = lapack.<span class="fu">clapack_lib</span>.<span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
505 <a class="sourceLine" id="cb22-13" data-line-number="13"> <span class="bu">Array</span><<span class="bu">Double</span>> A = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{</a>
506 <a class="sourceLine" id="cb22-14" data-line-number="14"> <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></a>
507 <a class="sourceLine" id="cb22-15" data-line-number="15"> });</a>
508 <a class="sourceLine" id="cb22-16" data-line-number="16"> <span class="bu">Array</span><<span class="bu">Double</span>> b = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{</a>
509 <a class="sourceLine" id="cb22-17" data-line-number="17"> <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></a>
510 <a class="sourceLine" id="cb22-18" data-line-number="18"> });</a>
511 <a class="sourceLine" id="cb22-19" data-line-number="19"> <span class="dt">int</span> info, m, n, lda, ldb, nrhs;</a>
512 <a class="sourceLine" id="cb22-20" data-line-number="20"></a>
513 <a class="sourceLine" id="cb22-21" data-line-number="21"> <span class="co">/* Initialization */</span></a>
514 <a class="sourceLine" id="cb22-22" data-line-number="22"> m = <span class="dv">5</span>;</a>
515 <a class="sourceLine" id="cb22-23" data-line-number="23"> n = <span class="dv">3</span>;</a>
516 <a class="sourceLine" id="cb22-24" data-line-number="24"> nrhs = <span class="dv">2</span>;</a>
517 <a class="sourceLine" id="cb22-25" data-line-number="25"> lda = <span class="dv">5</span>;</a>
518 <a class="sourceLine" id="cb22-26" data-line-number="26"> ldb = <span class="dv">5</span>;</a>
519 <a class="sourceLine" id="cb22-27" data-line-number="27"></a>
520 <a class="sourceLine" id="cb22-28" data-line-number="28"> <span class="co">/* Print Entry Matrix */</span></a>
521 <a class="sourceLine" id="cb22-29" data-line-number="29"> <span class="fu">print_matrix_colmajor</span>(<span class="st">"Entry Matrix A"</span>, m, n, A, lda );</a>
522 <a class="sourceLine" id="cb22-30" data-line-number="30"> <span class="co">/* Print Right Rand Side */</span></a>
523 <a class="sourceLine" id="cb22-31" data-line-number="31"> <span class="fu">print_matrix_colmajor</span>(<span class="st">"Right Hand Side b"</span>, n, nrhs, b, ldb );</a>
524 <a class="sourceLine" id="cb22-32" data-line-number="32"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
525 <a class="sourceLine" id="cb22-33" data-line-number="33"></a>
526 <a class="sourceLine" id="cb22-34" data-line-number="34"> <span class="co">/* Executable statements */</span></a>
527 <a class="sourceLine" id="cb22-35" data-line-number="35"> <span class="co">// printf( "LAPACKE_dgels (col-major, high-level) Example Program Results\n" );</span></a>
528 <a class="sourceLine" id="cb22-36" data-line-number="36"> <span class="co">/* Solve least squares problem*/</span></a>
529 <a class="sourceLine" id="cb22-37" data-line-number="37"> info = <span class="fu">clapack_dgels</span>(CblasColMajor, CblasNoTrans, m, n, nrhs, A.<span class="fu">elementPointer</span>(), lda, b.<span class="fu">elementPointer</span>(), ldb);</a>
530 <a class="sourceLine" id="cb22-38" data-line-number="38"></a>
531 <a class="sourceLine" id="cb22-39" data-line-number="39"> <span class="co">/* Print Solution */</span></a>
532 <a class="sourceLine" id="cb22-40" data-line-number="40"> <span class="fu">print_matrix_colmajor</span>(<span class="st">"Solution"</span>, n, nrhs, b, ldb );</a>
533 <a class="sourceLine" id="cb22-41" data-line-number="41"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
534 <a class="sourceLine" id="cb22-42" data-line-number="42"> <span class="bu">System</span>.<span class="fu">exit</span>(info);</a>
535 <a class="sourceLine" id="cb22-43" data-line-number="43"> }</a>
536 <a class="sourceLine" id="cb22-44" data-line-number="44"> }</a>
537 <a class="sourceLine" id="cb22-45" data-line-number="45"></a>
538 <a class="sourceLine" id="cb22-46" data-line-number="46"> <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, <span class="bu">Array</span><<span class="bu">Double</span>> mat, <span class="dt">int</span> ldm) {</a>
539 <a class="sourceLine" id="cb22-47" data-line-number="47"> <span class="dt">int</span> i, j;</a>
540 <a class="sourceLine" id="cb22-48" data-line-number="48"> <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);</a>
541 <a class="sourceLine" id="cb22-49" data-line-number="49"></a>
542 <a class="sourceLine" id="cb22-50" data-line-number="50"> <span class="kw">for</span>( i = <span class="dv">0</span>; i < m; i++ ) {</a>
543 <a class="sourceLine" id="cb22-51" data-line-number="51"> <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>, mat.<span class="fu">get</span>(i+j*ldm));</a>
544 <a class="sourceLine" id="cb22-52" data-line-number="52"> <span class="bu">System</span>.<span class="fu">out.printf</span>( <span class="st">"</span><span class="sc">\n</span><span class="st">"</span> );</a>
545 <a class="sourceLine" id="cb22-53" data-line-number="53"> }</a>
546 <a class="sourceLine" id="cb22-54" data-line-number="54"> }</a>
547 <a class="sourceLine" id="cb22-55" data-line-number="55">}</a></code></pre></div>
548 <h3 id="compiling-and-running-the-above-lapack-sample">Compiling and running the above LAPACK sample</h3>
549 <div class="sourceCode" id="cb23"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb23-1" data-line-number="1"></a>
550 <a class="sourceLine" id="cb23-2" data-line-number="2"><span class="ex">javac</span> -cp clapack.jar TestLapack.java</a>
551 <a class="sourceLine" id="cb23-3" data-line-number="3"></a>
552 <a class="sourceLine" id="cb23-4" data-line-number="4"><span class="ex">java</span> -cp clapack.jar:. TestLapack</a></code></pre></div>
553 <h2 id="using-lapack-library-mac-os">Using LAPACK library (Mac OS)</h2>
554 <p>On Mac OS, lapack is installed under /usr/local/opt/lapack directory.</p>
555 <h3 id="jextracting-lapacke.h">jextracting lapacke.h</h3>
556 <div class="sourceCode" id="cb24"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb24-1" data-line-number="1"></a>
557 <a class="sourceLine" id="cb24-2" data-line-number="2"><span class="ex">jextract</span> -L /usr/local/opt/lapack/lib \</a>
558 <a class="sourceLine" id="cb24-3" data-line-number="3"> -l lapacke -t lapack --record-library-path \</a>
559 <a class="sourceLine" id="cb24-4" data-line-number="4"> /usr/local/opt/lapack/include/lapacke.h -o clapack.jar</a></code></pre></div>
560 <h3 id="java-sample-code-that-uses-lapack-library-1">Java sample code that uses LAPACK library</h3>
561 <div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1"></a>
562 <a class="sourceLine" id="cb25-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span></a>
563 <a class="sourceLine" id="cb25-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.Scope;</span></a>
564 <a class="sourceLine" id="cb25-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span></a>
565 <a class="sourceLine" id="cb25-5" data-line-number="5"></a>
566 <a class="sourceLine" id="cb25-6" data-line-number="6"><span class="kw">import static</span><span class="im"> lapack.lapacke_lib.*;</span></a>
567 <a class="sourceLine" id="cb25-7" data-line-number="7"></a>
568 <a class="sourceLine" id="cb25-8" data-line-number="8"><span class="kw">public</span> <span class="kw">class</span> TestLapack {</a>
569 <a class="sourceLine" id="cb25-9" data-line-number="9"> <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) {</a>
570 <a class="sourceLine" id="cb25-10" data-line-number="10"></a>
571 <a class="sourceLine" id="cb25-11" data-line-number="11"> <span class="co">/* Locals */</span></a>
572 <a class="sourceLine" id="cb25-12" data-line-number="12"> <span class="kw">try</span> (Scope sc = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
573 <a class="sourceLine" id="cb25-13" data-line-number="13"> <span class="bu">Array</span><<span class="bu">Double</span>> A = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{</a>
574 <a class="sourceLine" id="cb25-14" data-line-number="14"> <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></a>
575 <a class="sourceLine" id="cb25-15" data-line-number="15"> });</a>
576 <a class="sourceLine" id="cb25-16" data-line-number="16"> <span class="bu">Array</span><<span class="bu">Double</span>> b = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{</a>
577 <a class="sourceLine" id="cb25-17" data-line-number="17"> <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></a>
578 <a class="sourceLine" id="cb25-18" data-line-number="18"> });</a>
579 <a class="sourceLine" id="cb25-19" data-line-number="19"> <span class="dt">int</span> info, m, n, lda, ldb, nrhs;</a>
580 <a class="sourceLine" id="cb25-20" data-line-number="20"></a>
581 <a class="sourceLine" id="cb25-21" data-line-number="21"> <span class="co">/* Initialization */</span></a>
582 <a class="sourceLine" id="cb25-22" data-line-number="22"> m = <span class="dv">5</span>;</a>
583 <a class="sourceLine" id="cb25-23" data-line-number="23"> n = <span class="dv">3</span>;</a>
584 <a class="sourceLine" id="cb25-24" data-line-number="24"> nrhs = <span class="dv">2</span>;</a>
585 <a class="sourceLine" id="cb25-25" data-line-number="25"> lda = <span class="dv">5</span>;</a>
586 <a class="sourceLine" id="cb25-26" data-line-number="26"> ldb = <span class="dv">5</span>;</a>
587 <a class="sourceLine" id="cb25-27" data-line-number="27"></a>
588 <a class="sourceLine" id="cb25-28" data-line-number="28"> <span class="co">/* Print Entry Matrix */</span></a>
589 <a class="sourceLine" id="cb25-29" data-line-number="29"> <span class="fu">print_matrix_colmajor</span>(<span class="st">"Entry Matrix A"</span>, m, n, A, lda );</a>
590 <a class="sourceLine" id="cb25-30" data-line-number="30"> <span class="co">/* Print Right Rand Side */</span></a>
591 <a class="sourceLine" id="cb25-31" data-line-number="31"> <span class="fu">print_matrix_colmajor</span>(<span class="st">"Right Hand Side b"</span>, n, nrhs, b, ldb );</a>
592 <a class="sourceLine" id="cb25-32" data-line-number="32"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
593 <a class="sourceLine" id="cb25-33" data-line-number="33"></a>
594 <a class="sourceLine" id="cb25-34" data-line-number="34"> <span class="co">/* Executable statements */</span></a>
595 <a class="sourceLine" id="cb25-35" data-line-number="35"> <span class="co">// printf( "LAPACKE_dgels (col-major, high-level) Example Program Results\n" );</span></a>
596 <a class="sourceLine" id="cb25-36" data-line-number="36"> <span class="co">/* Solve least squares problem*/</span></a>
597 <a class="sourceLine" id="cb25-37" data-line-number="37"> info = <span class="fu">LAPACKE_dgels</span>(LAPACK_COL_MAJOR, (<span class="dt">byte</span>)<span class="ch">'N'</span>, m, n, nrhs, A.<span class="fu">elementPointer</span>(), lda, b.<span class="fu">elementPointer</span>(), ldb);</a>
598 <a class="sourceLine" id="cb25-38" data-line-number="38"></a>
599 <a class="sourceLine" id="cb25-39" data-line-number="39"> <span class="co">/* Print Solution */</span></a>
600 <a class="sourceLine" id="cb25-40" data-line-number="40"> <span class="fu">print_matrix_colmajor</span>(<span class="st">"Solution"</span>, n, nrhs, b, ldb );</a>
601 <a class="sourceLine" id="cb25-41" data-line-number="41"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();</a>
602 <a class="sourceLine" id="cb25-42" data-line-number="42"> <span class="bu">System</span>.<span class="fu">exit</span>(info);</a>
603 <a class="sourceLine" id="cb25-43" data-line-number="43"> }</a>
604 <a class="sourceLine" id="cb25-44" data-line-number="44"> }</a>
605 <a class="sourceLine" id="cb25-45" data-line-number="45"></a>
606 <a class="sourceLine" id="cb25-46" data-line-number="46"> <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, <span class="bu">Array</span><<span class="bu">Double</span>> mat, <span class="dt">int</span> ldm) {</a>
607 <a class="sourceLine" id="cb25-47" data-line-number="47"> <span class="dt">int</span> i, j;</a>
608 <a class="sourceLine" id="cb25-48" data-line-number="48"> <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);</a>
609 <a class="sourceLine" id="cb25-49" data-line-number="49"></a>
610 <a class="sourceLine" id="cb25-50" data-line-number="50"> <span class="kw">for</span>( i = <span class="dv">0</span>; i < m; i++ ) {</a>
611 <a class="sourceLine" id="cb25-51" data-line-number="51"> <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>, mat.<span class="fu">get</span>(i+j*ldm));</a>
612 <a class="sourceLine" id="cb25-52" data-line-number="52"> <span class="bu">System</span>.<span class="fu">out.printf</span>( <span class="st">"</span><span class="sc">\n</span><span class="st">"</span> );</a>
613 <a class="sourceLine" id="cb25-53" data-line-number="53"> }</a>
614 <a class="sourceLine" id="cb25-54" data-line-number="54"> }</a>
615 <a class="sourceLine" id="cb25-55" data-line-number="55">}</a></code></pre></div>
616 <h3 id="compiling-and-running-the-above-lapack-sample-1">Compiling and running the above LAPACK sample</h3>
617 <div class="sourceCode" id="cb26"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb26-1" data-line-number="1"></a>
618 <a class="sourceLine" id="cb26-2" data-line-number="2"><span class="ex">javac</span> -cp clapack.jar TestLapack.java</a>
619 <a class="sourceLine" id="cb26-3" data-line-number="3"></a>
620 <a class="sourceLine" id="cb26-4" data-line-number="4"><span class="ex">java</span> -cp clapack.jar:. TestLapack</a></code></pre></div>
621 <h2 id="using-libproc-library-to-list-processes-from-java-mac-os">Using libproc library to list processes from Java (Mac OS)</h2>
622 <h3 id="jextract-a-jar-file-for-libproc.h">jextract a jar file for libproc.h</h3>
623 <p>jextract -t org.unix -lproc -L /usr/lib --record-library-path -o libproc.jar /usr/include/libproc.h</p>
624 <h3 id="java-program-that-uses-libproc-to-list-processes">Java program that uses libproc to list processes</h3>
625 <div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"></a>
626 <a class="sourceLine" id="cb27-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.foreign.*;</span></a>
627 <a class="sourceLine" id="cb27-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.memory.*;</span></a>
628 <a class="sourceLine" id="cb27-4" data-line-number="4"><span class="kw">import static</span><span class="im"> org.unix.libproc_lib.*;</span></a>
629 <a class="sourceLine" id="cb27-5" data-line-number="5"></a>
630 <a class="sourceLine" id="cb27-6" data-line-number="6"><span class="kw">public</span> <span class="kw">class</span> LibprocMain {</a>
631 <a class="sourceLine" id="cb27-7" data-line-number="7"> <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>;</a>
632 <a class="sourceLine" id="cb27-8" data-line-number="8"></a>
633 <a class="sourceLine" id="cb27-9" data-line-number="9"> <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) {</a>
634 <a class="sourceLine" id="cb27-10" data-line-number="10"> <span class="co">// Scope for native allocations</span></a>
635 <a class="sourceLine" id="cb27-11" data-line-number="11"> <span class="kw">try</span> (Scope s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
636 <a class="sourceLine" id="cb27-12" data-line-number="12"> <span class="co">// get the number of processes</span></a>
637 <a class="sourceLine" id="cb27-13" data-line-number="13"> <span class="dt">int</span> numPids = <span class="fu">proc_listallpids</span>(Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>);</a>
638 <a class="sourceLine" id="cb27-14" data-line-number="14"> <span class="co">// allocate an array</span></a>
639 <a class="sourceLine" id="cb27-15" data-line-number="15"> <span class="bu">Array</span><<span class="bu">Integer</span>> pids = s.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">INT32</span>, numPids);</a>
640 <a class="sourceLine" id="cb27-16" data-line-number="16"> <span class="co">// list all the pids into the native array</span></a>
641 <a class="sourceLine" id="cb27-17" data-line-number="17"> <span class="fu">proc_listallpids</span>(pids.<span class="fu">elementPointer</span>(), numPids);</a>
642 <a class="sourceLine" id="cb27-18" data-line-number="18"> <span class="co">// convert native array to java array</span></a>
643 <a class="sourceLine" id="cb27-19" data-line-number="19"> <span class="dt">int</span>[] jpids = pids.<span class="fu">toArray</span>(num -> <span class="kw">new</span> <span class="dt">int</span>[num]);</a>
644 <a class="sourceLine" id="cb27-20" data-line-number="20"> <span class="co">// buffer for process name</span></a>
645 <a class="sourceLine" id="cb27-21" data-line-number="21"> Pointer<<span class="bu">Byte</span>> nameBuf = s.<span class="fu">allocate</span>(NativeTypes.<span class="fu">INT8</span>, NAME_BUF_MAX);</a>
646 <a class="sourceLine" id="cb27-22" data-line-number="22"> <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i < jpids.<span class="fu">length</span>; i++) {</a>
647 <a class="sourceLine" id="cb27-23" data-line-number="23"> <span class="dt">int</span> pid = jpids[i];</a>
648 <a class="sourceLine" id="cb27-24" data-line-number="24"> <span class="co">// get the process name</span></a>
649 <a class="sourceLine" id="cb27-25" data-line-number="25"> <span class="fu">proc_name</span>(pid, nameBuf, NAME_BUF_MAX);</a>
650 <a class="sourceLine" id="cb27-26" data-line-number="26"> <span class="bu">String</span> procName = Pointer.<span class="fu">toString</span>(nameBuf);</a>
651 <a class="sourceLine" id="cb27-27" data-line-number="27"> <span class="co">// print pid and process name</span></a>
652 <a class="sourceLine" id="cb27-28" data-line-number="28"> <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);</a>
653 <a class="sourceLine" id="cb27-29" data-line-number="29"> }</a>
654 <a class="sourceLine" id="cb27-30" data-line-number="30"> }</a>
655 <a class="sourceLine" id="cb27-31" data-line-number="31"> }</a>
656 <a class="sourceLine" id="cb27-32" data-line-number="32">}</a></code></pre></div>
657 <h3 id="running-the-java-code-that-uses-libproc">Running the Java code that uses libproc</h3>
658 <div class="sourceCode" id="cb28"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb28-1" data-line-number="1"></a>
659 <a class="sourceLine" id="cb28-2" data-line-number="2"><span class="ex">javac</span> -cp libproc.jar LibprocMain.java</a>
660 <a class="sourceLine" id="cb28-3" data-line-number="3"></a>
661 <a class="sourceLine" id="cb28-4" data-line-number="4"><span class="ex">java</span> -cp libproc.jar:. LibprocMain</a></code></pre></div>
662 <h2 id="using-readline-library-from-java-code-mac-os">Using readline library from Java code (Mac OS)</h2>
663 <h3 id="jextract-a-jar-file-for-readline.h">jextract a jar file for readline.h</h3>
664 <div class="sourceCode" id="cb29"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb29-1" data-line-number="1"></a>
665 <a class="sourceLine" id="cb29-2" data-line-number="2"><span class="ex">jextract</span> -l readline -L /usr/local/opt/readline/lib/ --record-library-path \</a>
666 <a class="sourceLine" id="cb29-3" data-line-number="3"> -t org.unix \</a>
667 <a class="sourceLine" id="cb29-4" data-line-number="4"> /usr/include/readline/readline.h \</a>
668 <a class="sourceLine" id="cb29-5" data-line-number="5"> --exclude-symbols readline_echoing_p -o readline.jar</a></code></pre></div>
669 <h3 id="java-code-that-uses-readline">Java code that uses readline</h3>
670 <div class="sourceCode" id="cb30"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb30-1" data-line-number="1"></a>
671 <a class="sourceLine" id="cb30-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.foreign.*;</span></a>
672 <a class="sourceLine" id="cb30-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.memory.*;</span></a>
673 <a class="sourceLine" id="cb30-4" data-line-number="4"><span class="kw">import static</span><span class="im"> org.unix.readline_lib.*;</span></a>
674 <a class="sourceLine" id="cb30-5" data-line-number="5"></a>
675 <a class="sourceLine" id="cb30-6" data-line-number="6"><span class="kw">public</span> <span class="kw">class</span> Readline {</a>
676 <a class="sourceLine" id="cb30-7" data-line-number="7"> <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) {</a>
677 <a class="sourceLine" id="cb30-8" data-line-number="8"> <span class="co">// Scope for native allocations</span></a>
678 <a class="sourceLine" id="cb30-9" data-line-number="9"> <span class="kw">try</span> (Scope s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
679 <a class="sourceLine" id="cb30-10" data-line-number="10"> <span class="co">// allocate C memory initialized with Java string content</span></a>
680 <a class="sourceLine" id="cb30-11" data-line-number="11"> var pstr = s.<span class="fu">allocateCString</span>(<span class="st">"name? "</span>);</a>
681 <a class="sourceLine" id="cb30-12" data-line-number="12"></a>
682 <a class="sourceLine" id="cb30-13" data-line-number="13"> <span class="co">// call "readline" API</span></a>
683 <a class="sourceLine" id="cb30-14" data-line-number="14"> var p = <span class="fu">readline</span>(pstr);</a>
684 <a class="sourceLine" id="cb30-15" data-line-number="15"></a>
685 <a class="sourceLine" id="cb30-16" data-line-number="16"> <span class="co">// print char* as is</span></a>
686 <a class="sourceLine" id="cb30-17" data-line-number="17"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(p);</a>
687 <a class="sourceLine" id="cb30-18" data-line-number="18"> <span class="co">// convert char* ptr from readline as Java String & print it</span></a>
688 <a class="sourceLine" id="cb30-19" data-line-number="19"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(Pointer.<span class="fu">toString</span>(p));</a>
689 <a class="sourceLine" id="cb30-20" data-line-number="20"> }</a>
690 <a class="sourceLine" id="cb30-21" data-line-number="21"> }</a>
691 <a class="sourceLine" id="cb30-22" data-line-number="22">}</a></code></pre></div>
692 <h3 id="running-the-java-code-that-uses-readline">Running the java code that uses readline</h3>
693 <pre><code>
694 javac -cp readline.jar Readline.java
695
696 java -cp readline.jar:. Readline
697 </code></pre>
698 <h2 id="using-libcurl-from-java-mac-os">Using libcurl from Java (Mac OS)</h2>
699 <h3 id="jextract-a-jar-for-curl.h">jextract a jar for curl.h</h3>
700 <div class="sourceCode" id="cb32"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb32-1" data-line-number="1"></a>
701 <a class="sourceLine" id="cb32-2" data-line-number="2"><span class="ex">jextract</span> -t org.unix -L /usr/lib -lcurl --record-library-path /usr/include/curl/curl.h -o curl.jar</a></code></pre></div>
702 <h3 id="java-code-that-uses-libcurl">Java code that uses libcurl</h3>
703 <div class="sourceCode" id="cb33"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb33-1" data-line-number="1"></a>
704 <a class="sourceLine" id="cb33-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.lang.invoke.*;</span></a>
705 <a class="sourceLine" id="cb33-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.*;</span></a>
706 <a class="sourceLine" id="cb33-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.foreign.memory.*;</span></a>
707 <a class="sourceLine" id="cb33-5" data-line-number="5"><span class="kw">import</span><span class="im"> org.unix.curl_lib;</span></a>
708 <a class="sourceLine" id="cb33-6" data-line-number="6"><span class="kw">import static</span><span class="im"> org.unix.curl_lib.*;</span></a>
709 <a class="sourceLine" id="cb33-7" data-line-number="7"><span class="kw">import static</span><span class="im"> org.unix.easy_lib.*;</span></a>
710 <a class="sourceLine" id="cb33-8" data-line-number="8"></a>
711 <a class="sourceLine" id="cb33-9" data-line-number="9"><span class="kw">public</span> <span class="kw">class</span> CurlMain {</a>
712 <a class="sourceLine" id="cb33-10" data-line-number="10"> <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) {</a>
713 <a class="sourceLine" id="cb33-11" data-line-number="11"> <span class="kw">try</span> (Scope s = curl_lib.<span class="fu">scope</span>().<span class="fu">fork</span>()) { </a>
714 <a class="sourceLine" id="cb33-12" data-line-number="12"> <span class="fu">curl_global_init</span>(CURL_GLOBAL_DEFAULT);</a>
715 <a class="sourceLine" id="cb33-13" data-line-number="13"> Pointer<<span class="bu">Void</span>> curl = <span class="fu">curl_easy_init</span>();</a>
716 <a class="sourceLine" id="cb33-14" data-line-number="14"> <span class="kw">if</span>(!curl.<span class="fu">isNull</span>()) {</a>
717 <a class="sourceLine" id="cb33-15" data-line-number="15"> Pointer<<span class="bu">Byte</span>> url = s.<span class="fu">allocateCString</span>(args[<span class="dv">0</span>]);</a>
718 <a class="sourceLine" id="cb33-16" data-line-number="16"> <span class="fu">curl_easy_setopt</span>(curl, CURLOPT_URL, url);</a>
719 <a class="sourceLine" id="cb33-17" data-line-number="17"> <span class="dt">int</span> res = <span class="fu">curl_easy_perform</span>(curl);</a>
720 <a class="sourceLine" id="cb33-18" data-line-number="18"> <span class="kw">if</span> (res != CURLE_OK) {</a>
721 <a class="sourceLine" id="cb33-19" data-line-number="19"> <span class="fu">curl_easy_cleanup</span>(curl);</a>
722 <a class="sourceLine" id="cb33-20" data-line-number="20"> }</a>
723 <a class="sourceLine" id="cb33-21" data-line-number="21"> }</a>
724 <a class="sourceLine" id="cb33-22" data-line-number="22"> <span class="fu">curl_global_cleanup</span>();</a>
725 <a class="sourceLine" id="cb33-23" data-line-number="23"> }</a>
726 <a class="sourceLine" id="cb33-24" data-line-number="24"> }</a>
727 <a class="sourceLine" id="cb33-25" data-line-number="25">}</a></code></pre></div>
728 <h3 id="running-the-java-code-that-uses-libcurl">Running the java code that uses libcurl</h3>
729 <div class="sourceCode" id="cb34"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb34-1" data-line-number="1"></a>
730 <a class="sourceLine" id="cb34-2" data-line-number="2"><span class="ex">javac</span> -cp curl.jar CurlMain.java</a>
731 <a class="sourceLine" id="cb34-3" data-line-number="3"><span class="ex">java</span> -cp curl.jar:. CurlMain <span class="op"><</span>url<span class="op">></span></a></code></pre></div>
732 <h2 id="using-unistd.h-from-java-code-linux">Using unistd.h from Java code (Linux)</h2>
733 <h3 id="jextract-a-jar-file-for-unistd.h">jextract a jar file for unistd.h</h3>
734 <div class="sourceCode" id="cb35"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb35-1" data-line-number="1"></a>
735 <a class="sourceLine" id="cb35-2" data-line-number="2"><span class="ex">jextract</span> /usr/include/unistd.h -t org.unix -o unistd.jar</a></code></pre></div>
736 <h3 id="java-code-that-calls-getpid">Java code that calls getpid</h3>
737 <div class="sourceCode" id="cb36"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb36-1" data-line-number="1"></a>
738 <a class="sourceLine" id="cb36-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.foreign.*;</span></a>
739 <a class="sourceLine" id="cb36-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.lang.invoke.*;</span></a>
740 <a class="sourceLine" id="cb36-4" data-line-number="4"><span class="kw">import</span><span class="im"> org.unix.unistd_h;</span></a>
741 <a class="sourceLine" id="cb36-5" data-line-number="5"></a>
742 <a class="sourceLine" id="cb36-6" data-line-number="6"></a>
743 <a class="sourceLine" id="cb36-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> Getpid {</a>
744 <a class="sourceLine" id="cb36-8" data-line-number="8"> <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) {</a>
745 <a class="sourceLine" id="cb36-9" data-line-number="9"> <span class="co">// bind unistd interface</span></a>
746 <a class="sourceLine" id="cb36-10" data-line-number="10"> var u = Libraries.<span class="fu">bind</span>(MethodHandles.<span class="fu">lookup</span>(), unistd_h.<span class="fu">class</span>);</a>
747 <a class="sourceLine" id="cb36-11" data-line-number="11"> <span class="co">// call getpid from the unistd.h</span></a>
748 <a class="sourceLine" id="cb36-12" data-line-number="12"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(u.<span class="fu">getpid</span>());</a>
749 <a class="sourceLine" id="cb36-13" data-line-number="13"> <span class="co">// check process id from Java API!</span></a>
750 <a class="sourceLine" id="cb36-14" data-line-number="14"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(ProcessHandle.<span class="fu">current</span>().<span class="fu">pid</span>());</a>
751 <a class="sourceLine" id="cb36-15" data-line-number="15"> }</a>
752 <a class="sourceLine" id="cb36-16" data-line-number="16">}</a></code></pre></div>
753 <h3 id="running-the-java-code-that-uses-getpid">Running the Java code that uses getpid</h3>
754 <div class="sourceCode" id="cb37"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb37-1" data-line-number="1"></a>
755 <a class="sourceLine" id="cb37-2" data-line-number="2"><span class="ex">javac</span> -cp unistd.jar Getpid.java</a>
756 <a class="sourceLine" id="cb37-3" data-line-number="3"></a>
757 <a class="sourceLine" id="cb37-4" data-line-number="4"><span class="ex">java</span> -cp unistd.jar:. Getpid</a></code></pre></div>
758 <h2 id="using-opengl-graphic-library-ubuntu-16.04">Using OpenGL graphic library (Ubuntu 16.04)</h2>
759 <p>OpenGL is a popular portable graphic library: <a href="https://www.opengl.org/" class="uri">https://www.opengl.org/</a></p>
760 <h3 id="installing-opengl-ubuntu-16.04">Installing OpenGL (Ubuntu 16.04)</h3>
761 <p>Installing relevant OpenGL headers and libraries can be a bit tricky, as it depends on what graphic card is installed on the target platform. The following instruction assume that the standard version of OpenGL is used (e.g. mesa), rather than a proprietary one (Nvidia or AMD), although the changes to get these working are rather small.</p>
762 <p>OpenGL is always coupled with a bunch of other libraries, namely GLU and glut. You can install all those libraries using <code>apt</code>, as follows:</p>
763 <div class="sourceCode" id="cb38"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb38-1" data-line-number="1"></a>
764 <a class="sourceLine" id="cb38-2" data-line-number="2"><span class="fu">sudo</span> apt-get install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev</a></code></pre></div>
765 <p>If the installation was successful, OpenGL headers can be found under <code>/usr/include/GL</code>, while libraries can be found in the folder <code>/usr/lib/x86_64-linux-gnu/</code>.</p>
766 <h3 id="jextracting-opengl-ubuntu-16.04">jextracting OpenGL (Ubuntu 16.04)</h3>
767 <p>To extract the opengl libraries the following command suffices:</p>
768 <div class="sourceCode" id="cb39"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb39-1" data-line-number="1"></a>
769 <a class="sourceLine" id="cb39-2" data-line-number="2"><span class="ex">jextract</span> -L /usr/lib/x86_64-linux-gnu -l glut -l GLU -l GL --record-library-path -t opengl -o opengl.jar /usr/include/GL/glut.h</a></code></pre></div>
770 <p>Since glut depends on the other libraries (GLU and GL), it is not necessary to give additional headers to jextract.</p>
771 <h3 id="java-sample-code-that-uses-the-opengl-library">Java sample code that uses the OpenGL library</h3>
772 <div class="sourceCode" id="cb40"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb40-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span></a>
773 <a class="sourceLine" id="cb40-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.foreign.Scope;</span></a>
774 <a class="sourceLine" id="cb40-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span></a>
775 <a class="sourceLine" id="cb40-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.foreign.memory.Pointer;</span></a>
776 <a class="sourceLine" id="cb40-5" data-line-number="5"></a>
777 <a class="sourceLine" id="cb40-6" data-line-number="6"><span class="kw">import static</span><span class="im"> opengl.gl_lib.*;</span></a>
778 <a class="sourceLine" id="cb40-7" data-line-number="7"><span class="kw">import static</span><span class="im"> opengl.freeglut_std_lib.*;</span></a>
779 <a class="sourceLine" id="cb40-8" data-line-number="8"></a>
780 <a class="sourceLine" id="cb40-9" data-line-number="9"><span class="kw">public</span> <span class="kw">class</span> Teapot {</a>
781 <a class="sourceLine" id="cb40-10" data-line-number="10"></a>
782 <a class="sourceLine" id="cb40-11" data-line-number="11"> <span class="dt">float</span> rot = <span class="dv">0</span>;</a>
783 <a class="sourceLine" id="cb40-12" data-line-number="12"></a>
784 <a class="sourceLine" id="cb40-13" data-line-number="13"> <span class="fu">Teapot</span>(Scope sc) {</a>
785 <a class="sourceLine" id="cb40-14" data-line-number="14"> <span class="co">// Misc Parameters</span></a>
786 <a class="sourceLine" id="cb40-15" data-line-number="15"> <span class="bu">Array</span><<span class="bu">Float</span>> pos = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">FLOAT</span>, <span class="kw">new</span> <span class="dt">float</span>[] {<span class="fl">0.0f</span>, <span class="fl">15.0f</span>, <span class="fl">-15.0f</span>, <span class="dv">0</span>});</a>
787 <a class="sourceLine" id="cb40-16" data-line-number="16"> <span class="bu">Array</span><<span class="bu">Float</span>> spec = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">FLOAT</span>, <span class="kw">new</span> <span class="dt">float</span>[] {<span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">0</span>});</a>
788 <a class="sourceLine" id="cb40-17" data-line-number="17"> <span class="bu">Array</span><<span class="bu">Float</span>> shini = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">FLOAT</span>, <span class="kw">new</span> <span class="dt">float</span>[] {<span class="dv">113</span>});</a>
789 <a class="sourceLine" id="cb40-18" data-line-number="18"></a>
790 <a class="sourceLine" id="cb40-19" data-line-number="19"> <span class="co">// Reset Background</span></a>
791 <a class="sourceLine" id="cb40-20" data-line-number="20"> <span class="fu">glClearColor</span>(<span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">0</span>);</a>
792 <a class="sourceLine" id="cb40-21" data-line-number="21"></a>
793 <a class="sourceLine" id="cb40-22" data-line-number="22"> <span class="co">// Setup Lighting</span></a>
794 <a class="sourceLine" id="cb40-23" data-line-number="23"> <span class="fu">glShadeModel</span>(GL_SMOOTH);</a>
795 <a class="sourceLine" id="cb40-24" data-line-number="24"> <span class="fu">glLightfv</span>(GL_LIGHT0, GL_POSITION, pos.<span class="fu">elementPointer</span>());</a>
796 <a class="sourceLine" id="cb40-25" data-line-number="25"> <span class="fu">glLightfv</span>(GL_LIGHT0, GL_AMBIENT, spec.<span class="fu">elementPointer</span>());</a>
797 <a class="sourceLine" id="cb40-26" data-line-number="26"> <span class="fu">glLightfv</span>(GL_LIGHT0, GL_DIFFUSE, spec.<span class="fu">elementPointer</span>());</a>
798 <a class="sourceLine" id="cb40-27" data-line-number="27"> <span class="fu">glLightfv</span>(GL_LIGHT0, GL_SPECULAR, spec.<span class="fu">elementPointer</span>());</a>
799 <a class="sourceLine" id="cb40-28" data-line-number="28"> <span class="fu">glMaterialfv</span>(GL_FRONT, GL_SHININESS, shini.<span class="fu">elementPointer</span>());</a>
800 <a class="sourceLine" id="cb40-29" data-line-number="29"> <span class="fu">glEnable</span>(GL_LIGHTING);</a>
801 <a class="sourceLine" id="cb40-30" data-line-number="30"> <span class="fu">glEnable</span>(GL_LIGHT0);</a>
802 <a class="sourceLine" id="cb40-31" data-line-number="31"> <span class="fu">glEnable</span>(GL_DEPTH_TEST);</a>
803 <a class="sourceLine" id="cb40-32" data-line-number="32"> }</a>
804 <a class="sourceLine" id="cb40-33" data-line-number="33"></a>
805 <a class="sourceLine" id="cb40-34" data-line-number="34"> <span class="dt">void</span> <span class="fu">display</span>() {</a>
806 <a class="sourceLine" id="cb40-35" data-line-number="35"> <span class="fu">glClear</span>(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);</a>
807 <a class="sourceLine" id="cb40-36" data-line-number="36"> <span class="fu">glPushMatrix</span>();</a>
808 <a class="sourceLine" id="cb40-37" data-line-number="37"> <span class="fu">glRotatef</span>(-<span class="dv">20</span>, <span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">0</span>);</a>
809 <a class="sourceLine" id="cb40-38" data-line-number="38"> <span class="fu">glRotatef</span>(rot, <span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">0</span>);</a>
810 <a class="sourceLine" id="cb40-39" data-line-number="39"> <span class="fu">glutSolidTeapot</span>(<span class="fl">0.5</span>);</a>
811 <a class="sourceLine" id="cb40-40" data-line-number="40"> <span class="fu">glPopMatrix</span>();</a>
812 <a class="sourceLine" id="cb40-41" data-line-number="41"> <span class="fu">glutSwapBuffers</span>();</a>
813 <a class="sourceLine" id="cb40-42" data-line-number="42"> }</a>
814 <a class="sourceLine" id="cb40-43" data-line-number="43"></a>
815 <a class="sourceLine" id="cb40-44" data-line-number="44"> <span class="dt">void</span> <span class="fu">onIdle</span>() {</a>
816 <a class="sourceLine" id="cb40-45" data-line-number="45"> rot += <span class="fl">0.1</span>;</a>
817 <a class="sourceLine" id="cb40-46" data-line-number="46"> <span class="fu">glutPostRedisplay</span>();</a>
818 <a class="sourceLine" id="cb40-47" data-line-number="47"> }</a>
819 <a class="sourceLine" id="cb40-48" data-line-number="48"></a>
820 <a class="sourceLine" id="cb40-49" data-line-number="49"> <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) {</a>
821 <a class="sourceLine" id="cb40-50" data-line-number="50"> <span class="kw">try</span> (Scope sc = opengl.<span class="fu">gl_lib</span>.<span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
822 <a class="sourceLine" id="cb40-51" data-line-number="51"> Pointer<<span class="bu">Integer</span>> argc = sc.<span class="fu">allocate</span>(NativeTypes.<span class="fu">INT32</span>);</a>
823 <a class="sourceLine" id="cb40-52" data-line-number="52"> argc.<span class="fu">set</span>(<span class="dv">0</span>);</a>
824 <a class="sourceLine" id="cb40-53" data-line-number="53"> <span class="fu">glutInit</span>(argc, Pointer.<span class="fu">ofNull</span>());</a>
825 <a class="sourceLine" id="cb40-54" data-line-number="54"> <span class="fu">glutInitDisplayMode</span>(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);</a>
826 <a class="sourceLine" id="cb40-55" data-line-number="55"> <span class="fu">glutInitWindowSize</span>(<span class="dv">900</span>, <span class="dv">900</span>);</a>
827 <a class="sourceLine" id="cb40-56" data-line-number="56"> <span class="fu">glutCreateWindow</span>(sc.<span class="fu">allocateCString</span>(<span class="st">"Hello Panama!"</span>));</a>
828 <a class="sourceLine" id="cb40-57" data-line-number="57"> Teapot teapot = <span class="kw">new</span> <span class="fu">Teapot</span>(sc);</a>
829 <a class="sourceLine" id="cb40-58" data-line-number="58"> <span class="fu">glutDisplayFunc</span>(sc.<span class="fu">allocateCallback</span>(teapot::display));</a>
830 <a class="sourceLine" id="cb40-59" data-line-number="59"> <span class="fu">glutIdleFunc</span>(sc.<span class="fu">allocateCallback</span>(teapot::onIdle));</a>
831 <a class="sourceLine" id="cb40-60" data-line-number="60"> <span class="fu">glutMainLoop</span>();</a>
832 <a class="sourceLine" id="cb40-61" data-line-number="61"> }</a>
833 <a class="sourceLine" id="cb40-62" data-line-number="62"> }</a>
834 <a class="sourceLine" id="cb40-63" data-line-number="63">}</a></code></pre></div>
835 <h3 id="running-the-java-code-that-uses-opengl-ubuntu-16.04">Running the Java code that uses OpenGL (Ubuntu 16.04)</h3>
836 <div class="sourceCode" id="cb41"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb41-1" data-line-number="1"></a>
837 <a class="sourceLine" id="cb41-2" data-line-number="2"><span class="ex">javac</span> -cp opengl.jar Teapot.java</a>
838 <a class="sourceLine" id="cb41-3" data-line-number="3"></a>
839 <a class="sourceLine" id="cb41-4" data-line-number="4"><span class="ex">java</span> -cp opengl.jar:. Teapot</a></code></pre></div>
840 <h2 id="using-opengl-graphic-library-windows">Using OpenGL graphic library (Windows)</h2>
841 <h3 id="installing-opengl">Installing OpenGL</h3>
842 <p>Download the freeglut package for MSVC at <a href="https://www.transmissionzero.co.uk/software/freeglut-devel/" class="uri">https://www.transmissionzero.co.uk/software/freeglut-devel/</a></p>
843 <p>Extract the freeglut zip.</p>
844 <h3 id="jextracting-opengl">jextracting OpenGL</h3>
845 <p>Navigate to the root directory of the extracted zip and run the following commands:</p>
846 <div class="sourceCode" id="cb42"><pre class="sourceCode powershell"><code class="sourceCode powershell"><a class="sourceLine" id="cb42-1" data-line-number="1"><span class="va">$inc</span> = <span class="st">"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0"</span></a>
847 <a class="sourceLine" id="cb42-2" data-line-number="2">jextract -L C:\Windows\System32\ -L .\freeglut\bin\x64\ -l opengl32 -l freeglut -t opengl -o opengl.<span class="fu">jar</span> --package-map <span class="st">"$inc\um\gl=opengl"</span> --record-library-path .\freeglut\include\<span class="fu">GL</span>\glut.<span class="fu">h</span></a></code></pre></div>
848 <p>The directory that is assigned to <code>$inc</code> is an example, and is system dependent. Make sure that the build number at the end of the path (in this case <code>10.0.17134.0</code>) is the latest one found in the parent folder (<code>C:\Program Files (x86)\Windows Kits\10\Include\</code>).</p>
849 <p>There are a bunch of warnings generated, but as long as the jar file is generated in the working directory the extraction was successful.</p>
850 <h3 id="java-sample-code-that-uses-the-opengl-library-1">Java sample code that uses the OpenGL library</h3>
851 <p>This is the same as in the Ubuntu section</p>
852 <h3 id="running-the-java-code-that-uses-opengl">Running the Java code that uses OpenGL</h3>
853 <div class="sourceCode" id="cb43"><pre class="sourceCode powershell"><code class="sourceCode powershell"><a class="sourceLine" id="cb43-1" data-line-number="1">javac -cp .\opengl.<span class="fu">jar</span> Teapot.<span class="fu">java</span></a>
854 <a class="sourceLine" id="cb43-2" data-line-number="2">java -cp <span class="st">"opengl.jar;."</span> Teapot</a></code></pre></div>
855 <h2 id="using-tensorflow-c-api-mac-os">Using TensorFlow C API (Mac OS)</h2>
856 <p>Quoted from <a href="https://www.tensorflow.org/install/lang_c" class="uri">https://www.tensorflow.org/install/lang_c</a></p>
857 <p>"TensorFlow provides a C API that can be used to build bindings for other languages. The API is defined in c_api.h and designed for simplicity and uniformity rather than convenience."</p>
858 <h3 id="installing-libtensorflow">Installing libtensorflow</h3>
859 <p>You can follow the setup procedure as described in the above page.</p>
860 <p>Alternatively, on Mac, you can install libtensorflow using HomeBrew</p>
861 <div class="sourceCode" id="cb44"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb44-1" data-line-number="1"></a>
862 <a class="sourceLine" id="cb44-2" data-line-number="2"><span class="ex">brew</span> install libtensorflow</a></code></pre></div>
863 <p>Tensorflow ship the libtensorflow with an .so extension, this doesn't work well for java on MacOS as java expect .dylib extension. To work around this, create a symbolic link.</p>
864 <div class="sourceCode" id="cb45"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb45-1" data-line-number="1"></a>
865 <a class="sourceLine" id="cb45-2" data-line-number="2"><span class="fu">sudo</span> ln -s /usr/local/lib/libtensorflow.so /usr/local/lib/libtensorflow.dylib</a></code></pre></div>
866 <h3 id="jextracting-libtensorflow-c_api.h">jextracting libtensorflow c_api.h</h3>
867 <p>The following command can be used to extract c_api.h.</p>
868 <div class="sourceCode" id="cb46"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb46-1" data-line-number="1"></a>
869 <a class="sourceLine" id="cb46-2" data-line-number="2"><span class="ex">jextract</span> -C -x -C c++ \</a>
870 <a class="sourceLine" id="cb46-3" data-line-number="3"> -L /usr/local/lib -l tensorflow --record-library-path \</a>
871 <a class="sourceLine" id="cb46-4" data-line-number="4"> -o tf.jar -t org.tensorflow.panama \</a>
872 <a class="sourceLine" id="cb46-5" data-line-number="5"> /usr/local/include/tensorflow/c/c_api.h</a></code></pre></div>
873 <p>The caveat to extract tensorflow C API is that it declare function prototype without argument in C++ style, for example, TF_Version(), which is considered incomplete C function prototype instead of C style as in TF_Version(void). An incomplete function prototype will become vararg funciton. To avoid that, we need to pass clang '-x c++' options to jextract with '-C -x -C c++'</p>
874 <h3 id="java-sample-code-that-uses-tensorflow-library">Java sample code that uses tensorflow library</h3>
875 <div class="sourceCode" id="cb47"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb47-1" data-line-number="1"></a>
876 <a class="sourceLine" id="cb47-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span></a>
877 <a class="sourceLine" id="cb47-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.foreign.Scope;</span></a>
878 <a class="sourceLine" id="cb47-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span></a>
879 <a class="sourceLine" id="cb47-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.foreign.memory.LayoutType;</span></a>
880 <a class="sourceLine" id="cb47-6" data-line-number="6"><span class="kw">import</span><span class="im"> java.foreign.memory.Pointer;</span></a>
881 <a class="sourceLine" id="cb47-7" data-line-number="7"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_DataType;</span></a>
882 <a class="sourceLine" id="cb47-8" data-line-number="8"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Graph;</span></a>
883 <a class="sourceLine" id="cb47-9" data-line-number="9"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Operation;</span></a>
884 <a class="sourceLine" id="cb47-10" data-line-number="10"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_OperationDescription;</span></a>
885 <a class="sourceLine" id="cb47-11" data-line-number="11"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Output;</span></a>
886 <a class="sourceLine" id="cb47-12" data-line-number="12"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Session;</span></a>
887 <a class="sourceLine" id="cb47-13" data-line-number="13"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_SessionOptions;</span></a>
888 <a class="sourceLine" id="cb47-14" data-line-number="14"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Status;</span></a>
889 <a class="sourceLine" id="cb47-15" data-line-number="15"><span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Tensor;</span></a>
890 <a class="sourceLine" id="cb47-16" data-line-number="16"></a>
891 <a class="sourceLine" id="cb47-17" data-line-number="17"><span class="kw">import static</span><span class="im"> org.tensorflow.panama.c_api_lib.*;</span></a>
892 <a class="sourceLine" id="cb47-18" data-line-number="18"><span class="kw">import static</span><span class="im"> org.tensorflow.panama.c_api_lib.TF_DataType.*;</span></a>
893 <a class="sourceLine" id="cb47-19" data-line-number="19"></a>
894 <a class="sourceLine" id="cb47-20" data-line-number="20"><span class="kw">public</span> <span class="kw">class</span> TensorFlowExample {</a>
895 <a class="sourceLine" id="cb47-21" data-line-number="21"> <span class="dt">static</span> Pointer<TF_Operation> <span class="fu">PlaceHolder</span>(Pointer<TF_Graph> graph, Pointer<TF_Status> status,</a>
896 <a class="sourceLine" id="cb47-22" data-line-number="22"> <span class="at">@TF_DataType</span> <span class="dt">int</span> dtype, <span class="bu">String</span> name) {</a>
897 <a class="sourceLine" id="cb47-23" data-line-number="23"> <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
898 <a class="sourceLine" id="cb47-24" data-line-number="24"> Pointer<TF_OperationDescription> desc = <span class="fu">TF_NewOperation</span>(graph,</a>
899 <a class="sourceLine" id="cb47-25" data-line-number="25"> s.<span class="fu">allocateCString</span>(<span class="st">"Placeholder"</span>), s.<span class="fu">allocateCString</span>(name));</a>
900 <a class="sourceLine" id="cb47-26" data-line-number="26"> <span class="fu">TF_SetAttrType</span>(desc, s.<span class="fu">allocateCString</span>(<span class="st">"dtype"</span>), TF_FLOAT);</a>
901 <a class="sourceLine" id="cb47-27" data-line-number="27"> <span class="kw">return</span> <span class="fu">TF_FinishOperation</span>(desc, status);</a>
902 <a class="sourceLine" id="cb47-28" data-line-number="28"> }</a>
903 <a class="sourceLine" id="cb47-29" data-line-number="29"> }</a>
904 <a class="sourceLine" id="cb47-30" data-line-number="30"></a>
905 <a class="sourceLine" id="cb47-31" data-line-number="31"> <span class="dt">static</span> Pointer<TF_Operation> <span class="fu">ConstValue</span>(Pointer<TF_Graph> graph, Pointer<TF_Status> status,</a>
906 <a class="sourceLine" id="cb47-32" data-line-number="32"> Pointer<TF_Tensor> tensor, <span class="bu">String</span> name) {</a>
907 <a class="sourceLine" id="cb47-33" data-line-number="33"> <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
908 <a class="sourceLine" id="cb47-34" data-line-number="34"> Pointer<TF_OperationDescription> desc = <span class="fu">TF_NewOperation</span>(graph,</a>
909 <a class="sourceLine" id="cb47-35" data-line-number="35"> s.<span class="fu">allocateCString</span>(<span class="st">"Const"</span>), s.<span class="fu">allocateCString</span>(name));</a>
910 <a class="sourceLine" id="cb47-36" data-line-number="36"> <span class="fu">TF_SetAttrTensor</span>(desc, s.<span class="fu">allocateCString</span>(<span class="st">"value"</span>), tensor, status);</a>
911 <a class="sourceLine" id="cb47-37" data-line-number="37"> <span class="fu">TF_SetAttrType</span>(desc, s.<span class="fu">allocateCString</span>(<span class="st">"dtype"</span>), <span class="fu">TF_TensorType</span>(tensor));</a>
912 <a class="sourceLine" id="cb47-38" data-line-number="38"> <span class="kw">return</span> <span class="fu">TF_FinishOperation</span>(desc, status);</a>
913 <a class="sourceLine" id="cb47-39" data-line-number="39"> }</a>
914 <a class="sourceLine" id="cb47-40" data-line-number="40"> }</a>
915 <a class="sourceLine" id="cb47-41" data-line-number="41"></a>
916 <a class="sourceLine" id="cb47-42" data-line-number="42"> <span class="dt">static</span> Pointer<TF_Operation> <span class="fu">Add</span>(Pointer<TF_Graph> graph, Pointer<TF_Status> status,</a>
917 <a class="sourceLine" id="cb47-43" data-line-number="43"> Pointer<TF_Operation> one, Pointer<TF_Operation> two,</a>
918 <a class="sourceLine" id="cb47-44" data-line-number="44"> <span class="bu">String</span> name) {</a>
919 <a class="sourceLine" id="cb47-45" data-line-number="45"> <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
920 <a class="sourceLine" id="cb47-46" data-line-number="46"> Pointer<TF_OperationDescription> desc = <span class="fu">TF_NewOperation</span>(graph,</a>
921 <a class="sourceLine" id="cb47-47" data-line-number="47"> s.<span class="fu">allocateCString</span>(<span class="st">"AddN"</span>), s.<span class="fu">allocateCString</span>(name));</a>
922 <a class="sourceLine" id="cb47-48" data-line-number="48"> <span class="bu">Array</span><TF_Output> add_inputs = s.<span class="fu">allocateArray</span>(</a>
923 <a class="sourceLine" id="cb47-49" data-line-number="49"> LayoutType.<span class="fu">ofStruct</span>(TF_Output.<span class="fu">class</span>),<span class="dv">2</span>);</a>
924 <a class="sourceLine" id="cb47-50" data-line-number="50"> add_inputs.<span class="fu">get</span>(<span class="dv">0</span>).<span class="fu">oper</span>$<span class="fu">set</span>(one);</a>
925 <a class="sourceLine" id="cb47-51" data-line-number="51"> add_inputs.<span class="fu">get</span>(<span class="dv">0</span>).<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);</a>
926 <a class="sourceLine" id="cb47-52" data-line-number="52"> add_inputs.<span class="fu">get</span>(<span class="dv">1</span>).<span class="fu">oper</span>$<span class="fu">set</span>(two);</a>
927 <a class="sourceLine" id="cb47-53" data-line-number="53"> add_inputs.<span class="fu">get</span>(<span class="dv">1</span>).<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);</a>
928 <a class="sourceLine" id="cb47-54" data-line-number="54"> <span class="fu">TF_AddInputList</span>(desc, add_inputs.<span class="fu">elementPointer</span>(), <span class="dv">2</span>);</a>
929 <a class="sourceLine" id="cb47-55" data-line-number="55"> <span class="kw">return</span> <span class="fu">TF_FinishOperation</span>(desc, status);</a>
930 <a class="sourceLine" id="cb47-56" data-line-number="56"> }</a>
931 <a class="sourceLine" id="cb47-57" data-line-number="57"> }</a>
932 <a class="sourceLine" id="cb47-58" data-line-number="58"></a>
933 <a class="sourceLine" id="cb47-59" data-line-number="59"> <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><span class="kw">... </span>args) {</a>
934 <a class="sourceLine" id="cb47-60" data-line-number="60"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"TensorFlow C library version: "</span> + Pointer.<span class="fu">toString</span>(<span class="fu">TF_Version</span>()));</a>
935 <a class="sourceLine" id="cb47-61" data-line-number="61"></a>
936 <a class="sourceLine" id="cb47-62" data-line-number="62"> Pointer<TF_Graph> graph = <span class="fu">TF_NewGraph</span>();</a>
937 <a class="sourceLine" id="cb47-63" data-line-number="63"> Pointer<TF_SessionOptions> options = <span class="fu">TF_NewSessionOptions</span>();</a>
938 <a class="sourceLine" id="cb47-64" data-line-number="64"> Pointer<TF_Status> status = <span class="fu">TF_NewStatus</span>();</a>
939 <a class="sourceLine" id="cb47-65" data-line-number="65"> Pointer<TF_Session> session = <span class="fu">TF_NewSession</span>(graph, options, status);</a>
940 <a class="sourceLine" id="cb47-66" data-line-number="66"></a>
941 <a class="sourceLine" id="cb47-67" data-line-number="67"> <span class="dt">float</span> in_val_one = <span class="fl">4.0f</span>;</a>
942 <a class="sourceLine" id="cb47-68" data-line-number="68"> <span class="dt">float</span> const_two = <span class="fl">2.0f</span>;</a>
943 <a class="sourceLine" id="cb47-69" data-line-number="69"></a>
944 <a class="sourceLine" id="cb47-70" data-line-number="70"> Pointer<TF_Tensor> tensor_in = <span class="fu">TF_AllocateTensor</span>(TF_FLOAT, Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>, <span class="bu">Float</span>.<span class="fu">BYTES</span>);</a>
945 <a class="sourceLine" id="cb47-71" data-line-number="71"> <span class="fu">TF_TensorData</span>(tensor_in).<span class="fu">cast</span>(NativeTypes.<span class="fu">FLOAT</span>).<span class="fu">set</span>(in_val_one);</a>
946 <a class="sourceLine" id="cb47-72" data-line-number="72"> Pointer<TF_Tensor> tensor_const_two = <span class="fu">TF_AllocateTensor</span>(TF_FLOAT, Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>, <span class="bu">Float</span>.<span class="fu">BYTES</span>);</a>
947 <a class="sourceLine" id="cb47-73" data-line-number="73"> <span class="fu">TF_TensorData</span>(tensor_const_two).<span class="fu">cast</span>(NativeTypes.<span class="fu">FLOAT</span>).<span class="fu">set</span>(const_two);</a>
948 <a class="sourceLine" id="cb47-74" data-line-number="74"></a>
949 <a class="sourceLine" id="cb47-75" data-line-number="75"> <span class="co">// Operations</span></a>
950 <a class="sourceLine" id="cb47-76" data-line-number="76"> Pointer<TF_Operation> feed = <span class="fu">PlaceHolder</span>(graph, status, TF_FLOAT, <span class="st">"feed"</span>);</a>
951 <a class="sourceLine" id="cb47-77" data-line-number="77"> Pointer<TF_Operation> two = <span class="fu">ConstValue</span>(graph, status, tensor_const_two, <span class="st">"const"</span>);</a>
952 <a class="sourceLine" id="cb47-78" data-line-number="78"> Pointer<TF_Operation> add = <span class="fu">Add</span>(graph, status, feed, two, <span class="st">"add"</span>);</a>
953 <a class="sourceLine" id="cb47-79" data-line-number="79"></a>
954 <a class="sourceLine" id="cb47-80" data-line-number="80"></a>
955 <a class="sourceLine" id="cb47-81" data-line-number="81"> <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {</a>
956 <a class="sourceLine" id="cb47-82" data-line-number="82"> var ltPtrTensor = LayoutType.<span class="fu">ofStruct</span>(TF_Tensor.<span class="fu">class</span>).<span class="fu">pointer</span>();</a>
957 <a class="sourceLine" id="cb47-83" data-line-number="83"></a>
958 <a class="sourceLine" id="cb47-84" data-line-number="84"> <span class="co">// Session Inputs</span></a>
959 <a class="sourceLine" id="cb47-85" data-line-number="85"> TF_Output input_operations = s.<span class="fu">allocateStruct</span>(TF_Output.<span class="fu">class</span>);</a>
960 <a class="sourceLine" id="cb47-86" data-line-number="86"> input_operations.<span class="fu">oper</span>$<span class="fu">set</span>(feed);</a>
961 <a class="sourceLine" id="cb47-87" data-line-number="87"> input_operations.<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);</a>
962 <a class="sourceLine" id="cb47-88" data-line-number="88"> Pointer<Pointer<TF_Tensor>> input_tensors = s.<span class="fu">allocate</span>(ltPtrTensor);</a>
963 <a class="sourceLine" id="cb47-89" data-line-number="89"> input_tensors.<span class="fu">set</span>(tensor_in);</a>
964 <a class="sourceLine" id="cb47-90" data-line-number="90"></a>
965 <a class="sourceLine" id="cb47-91" data-line-number="91"> <span class="co">// Session Outputs</span></a>
966 <a class="sourceLine" id="cb47-92" data-line-number="92"> TF_Output output_operations = s.<span class="fu">allocateStruct</span>(TF_Output.<span class="fu">class</span>);</a>
967 <a class="sourceLine" id="cb47-93" data-line-number="93"> output_operations.<span class="fu">oper</span>$<span class="fu">set</span>(add);</a>
968 <a class="sourceLine" id="cb47-94" data-line-number="94"> output_operations.<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);</a>
969 <a class="sourceLine" id="cb47-95" data-line-number="95"> Pointer<Pointer<TF_Tensor>> output_tensors = s.<span class="fu">allocate</span>(ltPtrTensor);</a>
970 <a class="sourceLine" id="cb47-96" data-line-number="96"> <span class="fu">TF_SessionRun</span>(session, Pointer.<span class="fu">ofNull</span>(),</a>
971 <a class="sourceLine" id="cb47-97" data-line-number="97"> <span class="co">// Inputs</span></a>
972 <a class="sourceLine" id="cb47-98" data-line-number="98"> input_operations.<span class="fu">ptr</span>(), input_tensors, <span class="dv">1</span>,</a>
973 <a class="sourceLine" id="cb47-99" data-line-number="99"> <span class="co">// Outputs</span></a>
974 <a class="sourceLine" id="cb47-100" data-line-number="100"> output_operations.<span class="fu">ptr</span>(), output_tensors, <span class="dv">1</span>,</a>
975 <a class="sourceLine" id="cb47-101" data-line-number="101"> <span class="co">// Target operations</span></a>
976 <a class="sourceLine" id="cb47-102" data-line-number="102"> Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>, Pointer.<span class="fu">ofNull</span>(),</a>
977 <a class="sourceLine" id="cb47-103" data-line-number="103"> status);</a>
978 <a class="sourceLine" id="cb47-104" data-line-number="104"></a>
979 <a class="sourceLine" id="cb47-105" data-line-number="105"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="bu">String</span><span class="fu">.format</span>(<span class="st">"Session Run Status: </span><span class="sc">%d</span><span class="st"> - </span><span class="sc">%s</span><span class="st">"</span>,</a>
980 <a class="sourceLine" id="cb47-106" data-line-number="106"> <span class="fu">TF_GetCode</span>(status), Pointer.<span class="fu">toString</span>(<span class="fu">TF_Message</span>(status))));</a>
981 <a class="sourceLine" id="cb47-107" data-line-number="107"> Pointer<TF_Tensor> tensor_out = output_tensors.<span class="fu">get</span>();</a>
982 <a class="sourceLine" id="cb47-108" data-line-number="108"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Output Tensor Type: "</span> + <span class="fu">TF_TensorType</span>(tensor_out));</a>
983 <a class="sourceLine" id="cb47-109" data-line-number="109"> <span class="dt">float</span> outval = <span class="fu">TF_TensorData</span>(tensor_out).<span class="fu">cast</span>(NativeTypes.<span class="fu">FLOAT</span>).<span class="fu">get</span>();</a>
984 <a class="sourceLine" id="cb47-110" data-line-number="110"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Output Tensor Value: "</span> + outval);</a>
985 <a class="sourceLine" id="cb47-111" data-line-number="111"></a>
986 <a class="sourceLine" id="cb47-112" data-line-number="112"> <span class="fu">TF_CloseSession</span>(session, status);</a>
987 <a class="sourceLine" id="cb47-113" data-line-number="113"> <span class="fu">TF_DeleteSession</span>(session, status);</a>
988 <a class="sourceLine" id="cb47-114" data-line-number="114"></a>
989 <a class="sourceLine" id="cb47-115" data-line-number="115"> <span class="fu">TF_DeleteSessionOptions</span>(options);</a>
990 <a class="sourceLine" id="cb47-116" data-line-number="116"></a>
991 <a class="sourceLine" id="cb47-117" data-line-number="117"> <span class="fu">TF_DeleteGraph</span>(graph);</a>
992 <a class="sourceLine" id="cb47-118" data-line-number="118"></a>
993 <a class="sourceLine" id="cb47-119" data-line-number="119"> <span class="fu">TF_DeleteTensor</span>(tensor_in);</a>
994 <a class="sourceLine" id="cb47-120" data-line-number="120"> <span class="fu">TF_DeleteTensor</span>(tensor_out);</a>
995 <a class="sourceLine" id="cb47-121" data-line-number="121"> <span class="fu">TF_DeleteTensor</span>(tensor_const_two);</a>
996 <a class="sourceLine" id="cb47-122" data-line-number="122"></a>
997 <a class="sourceLine" id="cb47-123" data-line-number="123"> <span class="fu">TF_DeleteStatus</span>(status);</a>
998 <a class="sourceLine" id="cb47-124" data-line-number="124"> }</a>
999 <a class="sourceLine" id="cb47-125" data-line-number="125"> }</a>
1000 <a class="sourceLine" id="cb47-126" data-line-number="126">}</a></code></pre></div>
1001 <h3 id="compiling-and-running-the-above-tensorflow-sample">Compiling and running the above TensorFlow sample</h3>
1002 <div class="sourceCode" id="cb48"><pre class="sourceCode sh"><code class="sourceCode bash"><a class="sourceLine" id="cb48-1" data-line-number="1"></a>
1003 <a class="sourceLine" id="cb48-2" data-line-number="2"><span class="ex">javac</span> -cp tf.jar TensorFlowExample.java</a>
1004 <a class="sourceLine" id="cb48-3" data-line-number="3"></a>
1005 <a class="sourceLine" id="cb48-4" data-line-number="4"><span class="ex">java</span> -cp tf.jar:. TensorFlowExample</a></code></pre></div>
1006 <h2 id="using-tensorflow-c-api-windows">Using TensorFlow C API (Windows)</h2>
1007 <h3 id="installing-libtensorflow-1">Installing libtensorflow</h3>
1008 <p>You can download a binary distribution from <a href="https://www.tensorflow.org/install/lang_c" class="uri">https://www.tensorflow.org/install/lang_c</a></p>
1009 <p>Extract the zip file.</p>
1010 <h3 id="jextracting-libtensorflow-c_api.h-1">jextracting libtensorflow c_api.h</h3>
1011 <p>The problem outlined in the Mac OS instruction w.r.t. incorrect function prototypes still exists (though it has been solved in the Tensorflow github repository, this change has not yet made it into the binary distributions). On Windows there is however no jextract command that works around this, so the only way to extract the \include\c\c_api.h header successfully is to first manually fix the incorrect function prototypes:</p>
1012 <div class="sourceCode" id="cb49"><pre class="sourceCode c"><code class="sourceCode c"><a class="sourceLine" id="cb49-1" data-line-number="1">TF_Version() -> TF_Version(<span class="dt">void</span>) </a>
1013 <a class="sourceLine" id="cb49-2" data-line-number="2">TF_NewGraph() -> TF_NewGraph(<span class="dt">void</span>) </a>
1014 <a class="sourceLine" id="cb49-3" data-line-number="3">TF_NewSessionOptions() -> TF_NewSessionOptions(<span class="dt">void</span>) </a>
1015 <a class="sourceLine" id="cb49-4" data-line-number="4">TF_NewStatus() -> TF_NewStatus(<span class="dt">void</span>)</a>
1016 <a class="sourceLine" id="cb49-5" data-line-number="5">TF_NewBuffer() -> TF_NewBuffer(<span class="dt">void</span>)</a>
1017 <a class="sourceLine" id="cb49-6" data-line-number="6">TF_NewImportGraphDefOptions() -> TF_NewImportGraphDefOptions(<span class="dt">void</span>)</a>
1018 <a class="sourceLine" id="cb49-7" data-line-number="7">TF_GetAllOpList() -> TF_GetAllOpList(<span class="dt">void</span>)</a></code></pre></div>
1019 <p>Once you've done this you can use the following jextract command from the libtensorflow root directory:</p>
1020 <div class="sourceCode" id="cb50"><pre class="sourceCode powershell"><code class="sourceCode powershell"><a class="sourceLine" id="cb50-1" data-line-number="1">jextract -L .\lib -l tensorflow -o tf.<span class="fu">jar</span> -t <span class="st">"org.tensorflow.panama"</span> --record-library-path .\include\tensorflow\c\c_api.<span class="fu">h</span></a></code></pre></div>
1021 <h3 id="java-sample-code-that-uses-tensorflow-library-1">Java sample code that uses tensorflow library</h3>
1022 <p>This is the same as for the Mac OS section.</p>
1023 <h3 id="compiling-and-running-the-above-tensorflow-sample-1">Compiling and running the above TensorFlow sample</h3>
1024 <div class="sourceCode" id="cb51"><pre class="sourceCode powershell"><code class="sourceCode powershell"><a class="sourceLine" id="cb51-1" data-line-number="1">javac -cp tf.<span class="fu">jar</span> TensorFlowExample.<span class="fu">java</span></a>
1025 <a class="sourceLine" id="cb51-2" data-line-number="2">java -cp <span class="st">"tf.jar;."</span> TensorFlowExample</a></code></pre></div>
1026 </body>
1027 </html>
|
1 <!DOCTYPE html>
2 <html>
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 type="text/css">code{white-space: pre;}</style>
9 <style type="text/css">
10 div.sourceCode { overflow-x: auto; }
11 table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
12 margin: 0; padding: 0; vertical-align: baseline; border: none; }
13 table.sourceCode { width: 100%; line-height: 100%; }
14 td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
15 td.sourceCode { padding-left: 5px; }
16 code > span.kw { color: #007020; font-weight: bold; } /* Keyword */
17 code > span.dt { color: #902000; } /* DataType */
18 code > span.dv { color: #40a070; } /* DecVal */
19 code > span.bn { color: #40a070; } /* BaseN */
20 code > span.fl { color: #40a070; } /* Float */
21 code > span.ch { color: #4070a0; } /* Char */
22 code > span.st { color: #4070a0; } /* String */
23 code > span.co { color: #60a0b0; font-style: italic; } /* Comment */
24 code > span.ot { color: #007020; } /* Other */
25 code > span.al { color: #ff0000; font-weight: bold; } /* Alert */
26 code > span.fu { color: #06287e; } /* Function */
27 code > span.er { color: #ff0000; font-weight: bold; } /* Error */
28 code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
29 code > span.cn { color: #880000; } /* Constant */
30 code > span.sc { color: #4070a0; } /* SpecialChar */
31 code > span.vs { color: #4070a0; } /* VerbatimString */
32 code > span.ss { color: #bb6688; } /* SpecialString */
33 code > span.im { } /* Import */
34 code > span.va { color: #19177c; } /* Variable */
35 code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
36 code > span.op { color: #666666; } /* Operator */
37 code > span.bu { } /* BuiltIn */
38 code > span.ex { } /* Extension */
39 code > span.pp { color: #bc7a00; } /* Preprocessor */
40 code > span.at { color: #7d9029; } /* Attribute */
41 code > span.do { color: #ba2121; font-style: italic; } /* Documentation */
42 code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
43 code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
44 code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
45 </style>
46 <link rel="stylesheet" href="../make/data/docs-resources/resources/jdk-default.css">
47 <!--[if lt IE 9]>
48 <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
49 <![endif]-->
50 </head>
51 <body>
52 <header>
53 <h1 class="title">Using Panama "foreign" JDK</h1>
54 </header>
55 <nav id="TOC">
56 <ul>
57 <li><a href="#using-panama-foreign-jdk">Using Panama "foreign" JDK</a><ul>
58 <li><a href="#windows-notes">Windows notes</a></li>
59 <li><a href="#hello-world">Hello World</a><ul>
60 <li><a href="#hello-world-c-header-helloworld.h">Hello World C Header (helloworld.h)</a></li>
61 <li><a href="#hello-world-c-source-helloworld.c">Hello World C Source (helloworld.c)</a></li>
62 <li><a href="#building-hello-world">Building Hello World</a></li>
63 <li><a href="#jextract-a-jar-file-for-helloworld.h">jextract a Jar file for helloworld.h</a></li>
64 <li><a href="#java-program-that-uses-extracted-helloworld-interface">Java program that uses extracted helloworld interface</a></li>
65 <li><a href="#running-the-java-code-that-invokes-helloworld">Running the Java code that invokes helloworld</a></li>
66 </ul></li>
67 <li><a href="#embedding-python-interpreter-in-your-java-program-mac-os">Embedding Python interpreter in your Java program (Mac OS)</a><ul>
68 <li><a href="#jextract-a-jar-file-for-python.h">jextract a Jar file for Python.h</a></li>
69 <li><a href="#java-program-that-uses-extracted-python-interface">Java program that uses extracted Python interface</a></li>
70 <li><a href="#running-the-java-code-that-calls-python-interpreter">Running the Java code that calls Python interpreter</a></li>
71 </ul></li>
72 <li><a href="#jlinking-python-interpreter-in-your-jdk-mac-os">jlinking Python Interpreter in your JDK (Mac OS)</a><ul>
73 <li><a href="#generating-jmod-using-jextract">Generating jmod using jextract</a></li>
74 <li><a href="#jlinking-python-module-to-create-a-jdk-with-python-in-it">Jlinking python module to create a JDK with Python in it</a></li>
75 <li><a href="#compile-and-run-user-code-with-pythonjdk-jdk">Compile and run user code with "pythonjdk" jdk</a></li>
76 </ul></li>
77 <li><a href="#embedding-python-interpreter-in-your-java-program-ubuntu-16.04">Embedding Python interpreter in your Java program (Ubuntu 16.04)</a><ul>
78 <li><a href="#jextract-a-jar-file-for-python.h-1">jextract a Jar file for Python.h</a></li>
79 <li><a href="#compiling-and-running-python-java-example">Compiling and Running Python Java example</a></li>
80 </ul></li>
81 <li><a href="#embedding-python-interpreter-in-your-java-program-windows">Embedding Python interpreter in your Java program (Windows)</a><ul>
82 <li><a href="#jextract-a-jar-file-for-python.h-2">jextract a Jar file for Python.h</a></li>
83 <li><a href="#compiling-and-running-python-java-example-1">Compiling and Running Python Java example</a></li>
84 </ul></li>
85 <li><a href="#using-sqlite3-library-in-your-java-program-mac-os">Using sqlite3 library in your Java program (Mac OS)</a><ul>
86 <li><a href="#jextract-a-jar-file-for-sqlite3.h">jextract a jar file for sqlite3.h</a></li>
157 </ul></li>
158 </ul>
159 </nav>
160 <?xml version="1.0" encoding="utf-8"?>
161 <h1 id="using-panama-foreign-jdk">Using Panama "foreign" JDK</h1>
162 <p>There are two ways to get a panama foreign branch JDK.</p>
163 <ol type="1">
164 <li>Locally build "foreign" branch of panama repo <a href="http://hg.openjdk.java.net/panama/dev/" class="uri">http://hg.openjdk.java.net/panama/dev/</a></li>
165 <li>Download pre-built panama "foreign" early access binaries from <a href="http://jdk.java.net/panama/" class="uri">http://jdk.java.net/panama/</a></li>
166 </ol>
167 <p>Using foreign function call in Java involves the following three steps:</p>
168 <ol type="1">
169 <li>Use <strong>jextract</strong> tool to generate java interface for your C header file(s)</li>
170 <li>Use <strong>java.foreign</strong> API to create ("bind") implementation for C header interfaces</li>
171 <li>Invoke C functions via the jextracted Java interface</li>
172 </ol>
173 <h3 id="windows-notes">Windows notes</h3>
174 <p>You will (almost always) need to have Visual Studio installed, since most libraries indirectly depend on Visual Studio runtime libraries and this currently means that jextract needs their header to extract successfully. Windows examples have been tested with <a href="https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2017">Build Tools for Visual Studio 2017</a>.</p>
175 <p>It is generally a good idea to give jextract a bunch of extra memory since a lot of big system headers are transitively included. The extra memory will make the jextract run significantly faster. Windows support was added only recently, and the memory usage of jextract has not been optimized yet, so this is a workaround. You can give extra memory by passing e.g. <code>-J-Xmx8G</code> to jextract as an additional argument, which in this example gives jextract 8 gigabytes of memory.</p>
176 <p>Commands are tested in PowerShell.</p>
177 <h2 id="hello-world">Hello World</h2>
178 <h3 id="hello-world-c-header-helloworld.h">Hello World C Header (helloworld.h)</h3>
179 <div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">
180 <span class="pp">#ifndef helloworld_h</span>
181 <span class="pp">#define helloworld_h</span>
182
183 <span class="kw">extern</span> <span class="dt">void</span> helloworld(<span class="dt">void</span>);
184
185 <span class="pp">#endif </span><span class="co">/* helloworld_h */</span>
186 </code></pre></div>
187 <h3 id="hello-world-c-source-helloworld.c">Hello World C Source (helloworld.c)</h3>
188 <div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">
189 <span class="pp">#include </span><span class="im"><stdio.h></span>
190
191 <span class="pp">#include </span><span class="im">"helloworld.h"</span>
192
193 <span class="dt">void</span> helloworld(<span class="dt">void</span>) {
194 printf(<span class="st">"Hello World!</span><span class="sc">\n</span><span class="st">"</span>);
195 }</code></pre></div>
196 <h3 id="building-hello-world">Building Hello World</h3>
197 <pre><code>
198 cc -shared -o helloworld.dylib helloworld.c
199 </code></pre>
200 <h3 id="jextract-a-jar-file-for-helloworld.h">jextract a Jar file for helloworld.h</h3>
201 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
202 <span class="ex">jextract</span> -t org.hello -L . -lhelloworld --record-library-path helloworld.h -o helloworld.jar</code></pre></div>
203 <h3 id="java-program-that-uses-extracted-helloworld-interface">Java program that uses extracted helloworld interface</h3>
204 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
205 <span class="kw">import</span><span class="im"> org.hello.helloworld_lib;</span>
206
207 <span class="kw">import static</span><span class="im"> org.hello.helloworld_lib.*;</span>
208
209 <span class="kw">public</span> <span class="kw">class</span> HelloWorld {
210 <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) {
211 <span class="kw">try</span> (Scope s = helloworld_lib.<span class="fu">scope</span>().<span class="fu">fork</span>()) {
212 <span class="fu">helloworld</span>();
213 }
214 }
215 }</code></pre></div>
216 <h3 id="running-the-java-code-that-invokes-helloworld">Running the Java code that invokes helloworld</h3>
217 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
218 <span class="ex">javac</span> -cp helloworld.jar HelloWorld.java
219
220 <span class="ex">java</span> -cp helloworld.jar:. HelloWorld</code></pre></div>
221 <h2 id="embedding-python-interpreter-in-your-java-program-mac-os">Embedding Python interpreter in your Java program (Mac OS)</h2>
222 <h3 id="jextract-a-jar-file-for-python.h">jextract a Jar file for Python.h</h3>
223 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
224 <span class="ex">jextract</span> -l python2.7 \
225 -L /System/Library/Frameworks/Python.framework/Versions/2.7/lib --record-library-path \
226 --exclude-symbols .*_FromFormatV<span class="dt">\|</span>_.*<span class="dt">\|</span>PyOS_vsnprintf<span class="dt">\|</span>.*_VaParse.*<span class="dt">\|</span>.*_VaBuild.*<span class="dt">\|</span>PyBuffer_SizeFromFormat<span class="dt">\|</span>vasprintf<span class="dt">\|</span>vfprintf<span class="dt">\|</span>vprintf<span class="dt">\|</span>vsprintf \
227 -t org.python \
228 /usr/include/python2.7/Python.h \
229 -o python.jar</code></pre></div>
230 <h3 id="java-program-that-uses-extracted-python-interface">Java program that uses extracted Python interface</h3>
231 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
232 <span class="co">// import java.foreign packages</span>
233 <span class="kw">import</span><span class="im"> java.foreign.Libraries;</span>
234 <span class="kw">import</span><span class="im"> java.foreign.Scope;</span>
235 <span class="kw">import</span><span class="im"> java.foreign.memory.Pointer;</span>
236
237 <span class="co">// import jextracted python 'header' classes</span>
238 <span class="kw">import static</span><span class="im"> org.python.Python_lib.*;</span>
239 <span class="kw">import static</span><span class="im"> org.python.pythonrun_lib.*;</span>
240
241 <span class="kw">public</span> <span class="kw">class</span> PythonMain {
242 <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) {
243 <span class="fu">Py_Initialize</span>();
244 <span class="kw">try</span> (Scope s = org.<span class="fu">python</span>.<span class="fu">Python_lib</span>.<span class="fu">scope</span>().<span class="fu">fork</span>()) {
245 <span class="fu">PyRun_SimpleStringFlags</span>(s.<span class="fu">allocateCString</span>(
246 <span class="st">"print(sum([33, 55, 66])); print('Hello from Python!')</span><span class="sc">\n</span><span class="st">"</span>),
247 Pointer.<span class="fu">ofNull</span>());
248 }
249 <span class="fu">Py_Finalize</span>();
250 }
251 }</code></pre></div>
252 <h3 id="running-the-java-code-that-calls-python-interpreter">Running the Java code that calls Python interpreter</h3>
253 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
254 <span class="ex">javac</span> -cp python.jar PythonMain.java
255
256 <span class="ex">java</span> -cp python.jar:. PythonMain</code></pre></div>
257 <h2 id="jlinking-python-interpreter-in-your-jdk-mac-os">jlinking Python Interpreter in your JDK (Mac OS)</h2>
258 <h3 id="generating-jmod-using-jextract">Generating jmod using jextract</h3>
259 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
260 <span class="ex">jextract</span> -l python2.7 \
261 -L /System/Library/Frameworks/Python.framework/Versions/2.7/lib \
262 --exclude-symbols .*_FromFormatV<span class="dt">\|</span>_.*<span class="dt">\|</span>PyOS_vsnprintf<span class="dt">\|</span>.*_VaParse.*<span class="dt">\|</span>.*_VaBuild.*<span class="dt">\|</span>PyBuffer_SizeFromFormat<span class="dt">\|</span>vasprintf<span class="dt">\|</span>vfprintf<span class="dt">\|</span>vprintf<span class="dt">\|</span>vsprintf \
263 -t org.python \
264 /usr/include/python2.7/Python.h \
265 -o org.python.jmod</code></pre></div>
266 <h3 id="jlinking-python-module-to-create-a-jdk-with-python-in-it">Jlinking python module to create a JDK with Python in it</h3>
267 <p>jdk.compiler and org.python modules are added to the generated (jlinked) JDK</p>
268 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
269 <span class="ex">jlink</span> --add-modules org.python,jdk.compiler --module-path . --output pythonjdk</code></pre></div>
270 <h3 id="compile-and-run-user-code-with-pythonjdk-jdk">Compile and run user code with "pythonjdk" jdk</h3>
271 <p>In the following commands, it is assumed that you've put $pythonjdk/bin in your $PATH</p>
272 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
273 <span class="ex">javac</span> PythonMain.java
274 <span class="ex">java</span> PythonMain</code></pre></div>
275 <h2 id="embedding-python-interpreter-in-your-java-program-ubuntu-16.04">Embedding Python interpreter in your Java program (Ubuntu 16.04)</h2>
276 <h3 id="jextract-a-jar-file-for-python.h-1">jextract a Jar file for Python.h</h3>
277 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
278 <span class="ex">jextract</span> -l python2.7 \
279 -L /usr/lib/python2.7/config-x86_64-linux-gnu --record-library-path \
280 --exclude-symbols .*_FromFormatV<span class="dt">\|</span>_.*<span class="dt">\|</span>PyOS_vsnprintf<span class="dt">\|</span>.*_VaParse.*<span class="dt">\|</span>.*_VaBuild.*<span class="dt">\|</span>PyBuffer_SizeFromFormat<span class="dt">\|</span>vasprintf<span class="dt">\|</span>vfprintf<span class="dt">\|</span>vprintf<span class="dt">\|</span>vsprintf \
281 -t org.python \
282 /usr/include/python2.7/Python.h \
283 -o python.jar</code></pre></div>
284 <h3 id="compiling-and-running-python-java-example">Compiling and Running Python Java example</h3>
285 <p>Follow the instructions from the Mac OS section</p>
286 <h2 id="embedding-python-interpreter-in-your-java-program-windows">Embedding Python interpreter in your Java program (Windows)</h2>
287 <h3 id="jextract-a-jar-file-for-python.h-2">jextract a Jar file for Python.h</h3>
288 <p>Where python 2.7 is installed in the <code>C:\Python27</code> directory:</p>
289 <pre class="powershell"><code>jextract -L "C:\Windows\System32" -l python27 -o python.jar -t "org.python" --record-library-path C:\Python27\include\Python.h</code></pre>
290 <h3 id="compiling-and-running-python-java-example-1">Compiling and Running Python Java example</h3>
291 <pre class="powershell"><code>javac -cp python.jar PythonMain.java
292 java -cp "python.jar;." PythonMain</code></pre>
293 <h2 id="using-sqlite3-library-in-your-java-program-mac-os">Using sqlite3 library in your Java program (Mac OS)</h2>
294 <h3 id="jextract-a-jar-file-for-sqlite3.h">jextract a jar file for sqlite3.h</h3>
295 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
296 <span class="ex">jextract</span> /usr/include/sqlite3.h -t org.sqlite -lsqlite3 \
297 -L /usr/lib --record-library-path \
298 --exclude-symbols sqlite3_vmprintf \
299 --exclude-symbols sqlite3_vsnprintf \
300 -o sqlite3.jar</code></pre></div>
301 <h3 id="java-sample-that-uses-sqlite3-library">Java sample that uses sqlite3 library</h3>
302 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
303 <span class="kw">import</span><span class="im"> java.lang.invoke.*;</span>
304 <span class="kw">import</span><span class="im"> java.foreign.*;</span>
305 <span class="kw">import</span><span class="im"> java.foreign.memory.*;</span>
306 <span class="kw">import</span><span class="im"> org.sqlite.sqlite3_h.*;</span>
307 <span class="kw">import static</span><span class="im"> org.sqlite.sqlite3_lib.*;</span>
308
309 <span class="kw">public</span> <span class="kw">class</span> SqliteMain {
310 <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> {
311 <span class="kw">try</span> (Scope scope = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
312 <span class="co">// char* errMsg;</span>
313 Pointer<Pointer<<span class="bu">Byte</span>>> errMsg = scope.<span class="fu">allocate</span>(NativeTypes.<span class="fu">INT8</span>.<span class="fu">pointer</span>());
314
315 <span class="co">// sqlite3* db;</span>
316 Pointer<Pointer<sqlite3>> db = scope.<span class="fu">allocate</span>(LayoutType.<span class="fu">ofStruct</span>(sqlite3.<span class="fu">class</span>).<span class="fu">pointer</span>());
317
318 <span class="dt">int</span> rc = <span class="fu">sqlite3_open</span>(scope.<span class="fu">allocateCString</span>(<span class="st">"employee.db"</span>), db);
319 <span class="kw">if</span> (rc != <span class="dv">0</span>) {
320 <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_open failed: "</span> + rc);
321 <span class="kw">return</span>;
322 }
323
324 <span class="co">// create a new table</span>
325 Pointer<<span class="bu">Byte</span>> sql = scope.<span class="fu">allocateCString</span>(
326 <span class="st">"CREATE TABLE EMPLOYEE ("</span> +
327 <span class="st">" ID INT PRIMARY KEY NOT NULL,"</span> +
328 <span class="st">" NAME TEXT NOT NULL,"</span> +
329 <span class="st">" SALARY REAL NOT NULL )"</span>
330 );
331
332 rc = <span class="fu">sqlite3_exec</span>(db.<span class="fu">get</span>(), sql, <span class="bu">Callback</span>.<span class="fu">ofNull</span>(), Pointer.<span class="fu">ofNull</span>(), errMsg);
333
334 <span class="kw">if</span> (rc != <span class="dv">0</span>) {
335 <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_exec failed: "</span> + rc);
336 <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"SQL error: "</span> + Pointer.<span class="fu">toString</span>(errMsg.<span class="fu">get</span>()));
337 <span class="fu">sqlite3_free</span>(errMsg.<span class="fu">get</span>());
338 }
339
340 <span class="co">// insert two rows</span>
341 sql = scope.<span class="fu">allocateCString</span>(
342 <span class="st">"INSERT INTO EMPLOYEE (ID,NAME,SALARY) "</span> +
343 <span class="st">"VALUES (134, 'Xyz', 200000.0); "</span> +
344 <span class="st">"INSERT INTO EMPLOYEE (ID,NAME,SALARY) "</span> +
345 <span class="st">"VALUES (333, 'Abc', 100000.0);"</span>
346 );
347 rc = <span class="fu">sqlite3_exec</span>(db.<span class="fu">get</span>(), sql, <span class="bu">Callback</span>.<span class="fu">ofNull</span>(), Pointer.<span class="fu">ofNull</span>(), errMsg);
348
349 <span class="kw">if</span> (rc != <span class="dv">0</span>) {
350 <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_exec failed: "</span> + rc);
351 <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"SQL error: "</span> + Pointer.<span class="fu">toString</span>(errMsg.<span class="fu">get</span>()));
352 <span class="fu">sqlite3_free</span>(errMsg.<span class="fu">get</span>());
353 }
354
355 <span class="dt">int</span>[] rowNum = <span class="kw">new</span> <span class="dt">int</span>[<span class="dv">1</span>];
356 <span class="co">// callback to print rows from SELECT query</span>
357 <span class="bu">Callback</span><FI1> callback = scope.<span class="fu">allocateCallback</span>(FI1.<span class="fu">class</span>, (a, argc, argv, columnNames) -> {
358 <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>]++);
359 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"numColumns = "</span> + argc);
360 <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i < argc; i++) {
361 <span class="bu">String</span> name = Pointer.<span class="fu">toString</span>(columnNames.<span class="fu">offset</span>(i).<span class="fu">get</span>());
362 <span class="bu">String</span> value = Pointer.<span class="fu">toString</span>(argv.<span class="fu">offset</span>(i).<span class="fu">get</span>());
363 <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);
364 }
365 <span class="kw">return</span> <span class="dv">0</span>;
366 });
367
368 <span class="co">// select query</span>
369 sql = scope.<span class="fu">allocateCString</span>(<span class="st">"SELECT * FROM EMPLOYEE"</span>);
370 rc = <span class="fu">sqlite3_exec</span>(db.<span class="fu">get</span>(), sql, callback, Pointer.<span class="fu">ofNull</span>(), errMsg);
371
372 <span class="kw">if</span> (rc != <span class="dv">0</span>) {
373 <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"sqlite3_exec failed: "</span> + rc);
374 <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">"SQL error: "</span> + Pointer.<span class="fu">toString</span>(errMsg.<span class="fu">get</span>()));
375 <span class="fu">sqlite3_free</span>(errMsg.<span class="fu">get</span>());
376 }
377
378 <span class="fu">sqlite3_close</span>(db.<span class="fu">get</span>());
379 }
380 }
381 }</code></pre></div>
382 <h3 id="compiling-and-running-sqlite-java-example">Compiling and Running sqlite Java example</h3>
383 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
384 <span class="ex">javac</span> -cp sqlite3.jar SqlMain.java
385 <span class="ex">java</span> -cp sqlite3.jar:. SqlMain</code></pre></div>
386 <h2 id="using-sqlite3-library-in-your-java-program-ubuntu-16.04">Using sqlite3 library in your Java program (Ubuntu 16.04)</h2>
387 <h3 id="installing-sqlite3">Installing sqlite3</h3>
388 <p>On Ubuntu (16.04) to install sqlite3 headers and libraries the following command is required:</p>
389 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="fu">sudo</span> apt-get install libsqlite3-dev</code></pre></div>
390 <p>This should install the sqlite3 header (under <code>/usr/include</code>), as well as the sqlite3 shared library (under <code>/usr/lib/x86_64-linux-gnu</code>).</p>
391 <h3 id="jextract-a-jar-file-for-sqlite3.h-1">jextract a jar file for sqlite3.h</h3>
392 <p>To extract sqlite, run the following command:</p>
393 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash"><span class="ex">jextract</span> /usr/include/sqlite3.h -t org.sqlite -lsqlite3 \
394 -L /usr/lib/x86_64-linux-gnu --record-library-path \
395 --exclude-symbols sqlite3_vmprintf \
396 --exclude-symbols sqlite3_vsnprintf \
397 -o sqlite3.jar</code></pre></div>
398 <h3 id="compiling-and-running-sqlite-java-example-1">Compiling and Running sqlite Java example</h3>
399 <p>Please refer to the Mac OS instructions; once the library as been extracted (as per the instructions above), the sample program shown in that section should work on Ubuntu as well.</p>
400 <h2 id="using-blas-library">Using BLAS library</h2>
401 <p>BLAS is a popular library that allows fast matrix and vector computation: <a href="http://www.netlib.org/blas/" class="uri">http://www.netlib.org/blas/</a>.</p>
402 <h3 id="installing-openblas-mac-os">Installing OpenBLAS (Mac OS)</h3>
403 <p>On Mac, blas is available as part of the OpenBLAS library: <a href="https://github.com/xianyi/OpenBLAS/wiki" class="uri">https://github.com/xianyi/OpenBLAS/wiki</a></p>
404 <p>OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.</p>
405 <p>You can install openblas using HomeBrew</p>
406 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
407 <span class="ex">brew</span> install openblas</code></pre></div>
408 <p>It installs include and lib directories under /usr/local/opt/openblas</p>
409 <h3 id="installing-openblas-ubuntu-16.04">Installing OpenBLAS (Ubuntu 16.04)</h3>
410 <p>On Ubuntu, blas is distributed as part of the atlas library: <a href="http://math-atlas.sourceforge.net/" class="uri">http://math-atlas.sourceforge.net/</a>.</p>
411 <p>You can install atlas using apt</p>
412 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
413 <span class="fu">sudo</span> apt-get install libatlas-base-dev</code></pre></div>
414 <p>This command will install include files under <code>/usr/include/atlas</code> and corresponding libraries under <code>/usr/lib/atlas-dev</code>.</p>
415 <h3 id="jextracting-cblas.h-macos">jextracting cblas.h (MacOS)</h3>
416 <p>The following command can be used to extract cblas.h on MacOs</p>
417 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
418 <span class="ex">jextract</span> -C <span class="st">"-D FORCE_OPENBLAS_COMPLEX_STRUCT"</span> \
419 -L /usr/local/opt/openblas/lib \
420 -l openblas -t blas --record-library-path /usr/local/opt/openblas/include/cblas.h \
421 -o cblas.jar</code></pre></div>
422 <p>The FORCE_OPENBLAS_COMPLEX_STRUCT define is needed because jextract does not yet handle C99 <code>_Complex</code> types. The rest of the options are standard ones.</p>
423 <h3 id="jextracting-cblas.h-ubuntu-16.04">jextracting cblas.h (Ubuntu 16.04)</h3>
424 <p>The following command can be used to extract cblas.h on Ubuntu</p>
425 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
426 <span class="ex">jextract</span> -L /usr/lib/atlas-base -I /usr/include/atlas/ \
427 -l cblas -t blas --record-library-path \
428 /usr/include/atlas/cblas.h -o cblas.jar</code></pre></div>
429 <h3 id="java-sample-code-that-uses-cblas-library">Java sample code that uses cblas library</h3>
430 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
431 <span class="kw">import</span><span class="im"> blas.cblas_h;</span>
432 <span class="kw">import static</span><span class="im"> blas.cblas_lib.*;</span>
433 <span class="kw">import static</span><span class="im"> blas.cblas_lib.CBLAS_ORDER.*;</span>
434 <span class="kw">import static</span><span class="im"> blas.cblas_lib.CBLAS_TRANSPOSE.*;</span>
435
436 <span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span>
437 <span class="kw">import</span><span class="im"> java.foreign.Scope;</span>
438 <span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span>
439
440 <span class="kw">public</span> <span class="kw">class</span> TestBlas {
441 <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) {
442 <span class="at">@cblas_h</span>.<span class="fu">CBLAS_ORDER</span> <span class="dt">int</span> Layout;
443 <span class="at">@cblas_h</span>.<span class="fu">CBLAS_TRANSPOSE</span> <span class="dt">int</span> transa;
444
445 <span class="dt">double</span> alpha, beta;
446 <span class="dt">int</span> m, n, lda, incx, incy, i;
447
448 Layout = CblasColMajor;
449 transa = CblasNoTrans;
450
451 m = <span class="dv">4</span>; <span class="co">/* Size of Column ( the number of rows ) */</span>
452 n = <span class="dv">4</span>; <span class="co">/* Size of Row ( the number of columns ) */</span>
453 lda = <span class="dv">4</span>; <span class="co">/* Leading dimension of 5 * 4 matrix is 5 */</span>
454 incx = <span class="dv">1</span>;
455 incy = <span class="dv">1</span>;
456 alpha = <span class="dv">1</span>;
457 beta = <span class="dv">0</span>;
458
459 <span class="kw">try</span> (Scope sc = <span class="fu">scope</span>().<span class="fu">fork</span>()){
460 <span class="bu">Array</span><<span class="bu">Double</span>> a = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, m * n);
461 <span class="bu">Array</span><<span class="bu">Double</span>> x = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, n);
462 <span class="bu">Array</span><<span class="bu">Double</span>> y = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, n);
463 <span class="co">/* The elements of the first column */</span>
464 a.<span class="fu">set</span>(<span class="dv">0</span>, <span class="fl">1.0</span>);
465 a.<span class="fu">set</span>(<span class="dv">1</span>, <span class="fl">2.0</span>);
466 a.<span class="fu">set</span>(<span class="dv">2</span>, <span class="fl">3.0</span>);
467 a.<span class="fu">set</span>(<span class="dv">3</span>, <span class="fl">4.0</span>);
468 <span class="co">/* The elements of the second column */</span>
469 a.<span class="fu">set</span>(m, <span class="fl">1.0</span>);
470 a.<span class="fu">set</span>(m + <span class="dv">1</span>, <span class="fl">1.0</span>);
471 a.<span class="fu">set</span>(m + <span class="dv">2</span>, <span class="fl">1.0</span>);
472 a.<span class="fu">set</span>(m + <span class="dv">3</span>, <span class="fl">1.0</span>);
473 <span class="co">/* The elements of the third column */</span>
474 a.<span class="fu">set</span>(m * <span class="dv">2</span>, <span class="fl">3.0</span>);
475 a.<span class="fu">set</span>(m * <span class="dv">2</span> + <span class="dv">1</span>, <span class="fl">4.0</span>);
476 a.<span class="fu">set</span>(m * <span class="dv">2</span> + <span class="dv">2</span>, <span class="fl">5.0</span>);
477 a.<span class="fu">set</span>(m * <span class="dv">2</span> + <span class="dv">3</span>, <span class="fl">6.0</span>);
478 <span class="co">/* The elements of the fourth column */</span>
479 a.<span class="fu">set</span>(m * <span class="dv">3</span>, <span class="fl">5.0</span>);
480 a.<span class="fu">set</span>(m * <span class="dv">3</span> + <span class="dv">1</span>, <span class="fl">6.0</span>);
481 a.<span class="fu">set</span>(m * <span class="dv">3</span> + <span class="dv">2</span>, <span class="fl">7.0</span>);
482 a.<span class="fu">set</span>(m * <span class="dv">3</span> + <span class="dv">3</span>, <span class="fl">8.0</span>);
483 <span class="co">/* The elemetns of x and y */</span>
484 x.<span class="fu">set</span>(<span class="dv">0</span>, <span class="fl">1.0</span>);
485 x.<span class="fu">set</span>(<span class="dv">1</span>, <span class="fl">2.0</span>);
486 x.<span class="fu">set</span>(<span class="dv">2</span>, <span class="fl">1.0</span>);
487 x.<span class="fu">set</span>(<span class="dv">3</span>, <span class="fl">1.0</span>);
488 y.<span class="fu">set</span>(<span class="dv">0</span>, <span class="fl">0.0</span>);
489 y.<span class="fu">set</span>(<span class="dv">1</span>, <span class="fl">0.0</span>);
490 y.<span class="fu">set</span>(<span class="dv">2</span>, <span class="fl">0.0</span>);
491 y.<span class="fu">set</span>(<span class="dv">3</span>, <span class="fl">0.0</span>);
492
493 <span class="fu">cblas_dgemv</span>(Layout, transa, m, n, alpha, a.<span class="fu">elementPointer</span>(), lda, x.<span class="fu">elementPointer</span>(), incx, beta,
494 y.<span class="fu">elementPointer</span>(), incy);
495 <span class="co">/* Print y */</span>
496 <span class="kw">for</span> (i = <span class="dv">0</span>; i < n; i++)
497 <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, y.<span class="fu">get</span>(i)));
498 }
499 }
500 }</code></pre></div>
501 <h3 id="compiling-and-running-the-above-cblas-samples">Compiling and running the above cblas samples</h3>
502 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
503 <span class="ex">javac</span> -cp cblas.jar TestBlas.java
504
505 <span class="ex">java</span> -cp cblas.jar:. TestBlas</code></pre></div>
506 <h2 id="using-lapack-library-ubuntu">Using LAPACK library (Ubuntu)</h2>
507 <p>On Ubuntu, the same steps used to install the blas (via atlas) library also install headers and libraries for the LAPACK library, a linear algebra computation library built on top of blas.</p>
508 <h3 id="jextracting-clapack.h-ubuntu-16.04">jextracting clapack.h (Ubuntu 16.04)</h3>
509 <p>The following command can be used to extract the LAPACK header:</p>
510 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
511 <span class="ex">jextract</span> -L /usr/lib/atlas-base/atlas -I /usr/include/atlas/ \
512 -l lapack -t lapack --record-library-path /usr/include/atlas/clapack.h -o clapack.jar</code></pre></div>
513 <h3 id="java-sample-code-that-uses-lapack-library">Java sample code that uses LAPACK library</h3>
514 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span>
515 <span class="kw">import</span><span class="im"> java.foreign.Scope;</span>
516 <span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span>
517
518 <span class="kw">import static</span><span class="im"> lapack.clapack_lib.*;</span>
519 <span class="kw">import static</span><span class="im"> lapack.cblas_lib.*;</span>
520
521 <span class="kw">public</span> <span class="kw">class</span> TestLapack {
522 <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) {
523
524 <span class="co">/* Locals */</span>
525 <span class="kw">try</span> (Scope sc = lapack.<span class="fu">clapack_lib</span>.<span class="fu">scope</span>().<span class="fu">fork</span>()) {
526 <span class="bu">Array</span><<span class="bu">Double</span>> A = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{
527 <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>
528 });
529 <span class="bu">Array</span><<span class="bu">Double</span>> b = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{
530 -<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>
531 });
532 <span class="dt">int</span> info, m, n, lda, ldb, nrhs;
533
534 <span class="co">/* Initialization */</span>
535 m = <span class="dv">5</span>;
536 n = <span class="dv">3</span>;
537 nrhs = <span class="dv">2</span>;
538 lda = <span class="dv">5</span>;
539 ldb = <span class="dv">5</span>;
540
541 <span class="co">/* Print Entry Matrix */</span>
542 <span class="fu">print_matrix_colmajor</span>(<span class="st">"Entry Matrix A"</span>, m, n, A, lda );
543 <span class="co">/* Print Right Rand Side */</span>
544 <span class="fu">print_matrix_colmajor</span>(<span class="st">"Right Hand Side b"</span>, n, nrhs, b, ldb );
545 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();
546
547 <span class="co">/* Executable statements */</span>
548 <span class="co">// printf( "LAPACKE_dgels (col-major, high-level) Example Program Results\n" );</span>
549 <span class="co">/* Solve least squares problem*/</span>
550 info = <span class="fu">clapack_dgels</span>(CblasColMajor, CblasNoTrans, m, n, nrhs, A.<span class="fu">elementPointer</span>(), lda, b.<span class="fu">elementPointer</span>(), ldb);
551
552 <span class="co">/* Print Solution */</span>
553 <span class="fu">print_matrix_colmajor</span>(<span class="st">"Solution"</span>, n, nrhs, b, ldb );
554 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();
555 <span class="bu">System</span>.<span class="fu">exit</span>(info);
556 }
557 }
558
559 <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, <span class="bu">Array</span><<span class="bu">Double</span>> mat, <span class="dt">int</span> ldm) {
560 <span class="dt">int</span> i, j;
561 <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);
562
563 <span class="kw">for</span>( i = <span class="dv">0</span>; i < m; i++ ) {
564 <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>, mat.<span class="fu">get</span>(i+j*ldm));
565 <span class="bu">System</span>.<span class="fu">out.printf</span>( <span class="st">"</span><span class="sc">\n</span><span class="st">"</span> );
566 }
567 }
568 }</code></pre></div>
569 <h3 id="compiling-and-running-the-above-lapack-sample">Compiling and running the above LAPACK sample</h3>
570 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
571 <span class="ex">javac</span> -cp clapack.jar TestLapack.java
572
573 <span class="ex">java</span> -cp clapack.jar:. TestLapack</code></pre></div>
574 <h2 id="using-lapack-library-mac-os">Using LAPACK library (Mac OS)</h2>
575 <p>On Mac OS, lapack is installed under /usr/local/opt/lapack directory.</p>
576 <h3 id="jextracting-lapacke.h">jextracting lapacke.h</h3>
577 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
578 <span class="ex">jextract</span> -L /usr/local/opt/lapack/lib \
579 -l lapacke -t lapack --record-library-path \
580 /usr/local/opt/lapack/include/lapacke.h -o clapack.jar</code></pre></div>
581 <h3 id="java-sample-code-that-uses-lapack-library-1">Java sample code that uses LAPACK library</h3>
582 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
583 <span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span>
584 <span class="kw">import</span><span class="im"> java.foreign.Scope;</span>
585 <span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span>
586
587 <span class="kw">import static</span><span class="im"> lapack.lapacke_lib.*;</span>
588
589 <span class="kw">public</span> <span class="kw">class</span> TestLapack {
590 <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) {
591
592 <span class="co">/* Locals */</span>
593 <span class="kw">try</span> (Scope sc = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
594 <span class="bu">Array</span><<span class="bu">Double</span>> A = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{
595 <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>
596 });
597 <span class="bu">Array</span><<span class="bu">Double</span>> b = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">DOUBLE</span>, <span class="kw">new</span> <span class="dt">double</span>[]{
598 -<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>
599 });
600 <span class="dt">int</span> info, m, n, lda, ldb, nrhs;
601
602 <span class="co">/* Initialization */</span>
603 m = <span class="dv">5</span>;
604 n = <span class="dv">3</span>;
605 nrhs = <span class="dv">2</span>;
606 lda = <span class="dv">5</span>;
607 ldb = <span class="dv">5</span>;
608
609 <span class="co">/* Print Entry Matrix */</span>
610 <span class="fu">print_matrix_colmajor</span>(<span class="st">"Entry Matrix A"</span>, m, n, A, lda );
611 <span class="co">/* Print Right Rand Side */</span>
612 <span class="fu">print_matrix_colmajor</span>(<span class="st">"Right Hand Side b"</span>, n, nrhs, b, ldb );
613 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();
614
615 <span class="co">/* Executable statements */</span>
616 <span class="co">// printf( "LAPACKE_dgels (col-major, high-level) Example Program Results\n" );</span>
617 <span class="co">/* Solve least squares problem*/</span>
618 info = <span class="fu">LAPACKE_dgels</span>(LAPACK_COL_MAJOR, (<span class="dt">byte</span>)<span class="ch">'N'</span>, m, n, nrhs, A.<span class="fu">elementPointer</span>(), lda, b.<span class="fu">elementPointer</span>(), ldb);
619
620 <span class="co">/* Print Solution */</span>
621 <span class="fu">print_matrix_colmajor</span>(<span class="st">"Solution"</span>, n, nrhs, b, ldb );
622 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>();
623 <span class="bu">System</span>.<span class="fu">exit</span>(info);
624 }
625 }
626
627 <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, <span class="bu">Array</span><<span class="bu">Double</span>> mat, <span class="dt">int</span> ldm) {
628 <span class="dt">int</span> i, j;
629 <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);
630
631 <span class="kw">for</span>( i = <span class="dv">0</span>; i < m; i++ ) {
632 <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>, mat.<span class="fu">get</span>(i+j*ldm));
633 <span class="bu">System</span>.<span class="fu">out.printf</span>( <span class="st">"</span><span class="sc">\n</span><span class="st">"</span> );
634 }
635 }
636 }</code></pre></div>
637 <h3 id="compiling-and-running-the-above-lapack-sample-1">Compiling and running the above LAPACK sample</h3>
638 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
639 <span class="ex">javac</span> -cp clapack.jar TestLapack.java
640
641 <span class="ex">java</span> -cp clapack.jar:. TestLapack</code></pre></div>
642 <h2 id="using-libproc-library-to-list-processes-from-java-mac-os">Using libproc library to list processes from Java (Mac OS)</h2>
643 <h3 id="jextract-a-jar-file-for-libproc.h">jextract a jar file for libproc.h</h3>
644 <p>jextract -t org.unix -lproc -L /usr/lib --record-library-path -o libproc.jar /usr/include/libproc.h</p>
645 <h3 id="java-program-that-uses-libproc-to-list-processes">Java program that uses libproc to list processes</h3>
646 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
647 <span class="kw">import</span><span class="im"> java.foreign.*;</span>
648 <span class="kw">import</span><span class="im"> java.foreign.memory.*;</span>
649 <span class="kw">import static</span><span class="im"> org.unix.libproc_lib.*;</span>
650
651 <span class="kw">public</span> <span class="kw">class</span> LibprocMain {
652 <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>;
653
654 <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) {
655 <span class="co">// Scope for native allocations</span>
656 <span class="kw">try</span> (Scope s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
657 <span class="co">// get the number of processes</span>
658 <span class="dt">int</span> numPids = <span class="fu">proc_listallpids</span>(Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>);
659 <span class="co">// allocate an array</span>
660 <span class="bu">Array</span><<span class="bu">Integer</span>> pids = s.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">INT32</span>, numPids);
661 <span class="co">// list all the pids into the native array</span>
662 <span class="fu">proc_listallpids</span>(pids.<span class="fu">elementPointer</span>(), numPids);
663 <span class="co">// convert native array to java array</span>
664 <span class="dt">int</span>[] jpids = pids.<span class="fu">toArray</span>(num -> <span class="kw">new</span> <span class="dt">int</span>[num]);
665 <span class="co">// buffer for process name</span>
666 Pointer<<span class="bu">Byte</span>> nameBuf = s.<span class="fu">allocate</span>(NativeTypes.<span class="fu">INT8</span>, NAME_BUF_MAX);
667 <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i < jpids.<span class="fu">length</span>; i++) {
668 <span class="dt">int</span> pid = jpids[i];
669 <span class="co">// get the process name</span>
670 <span class="fu">proc_name</span>(pid, nameBuf, NAME_BUF_MAX);
671 <span class="bu">String</span> procName = Pointer.<span class="fu">toString</span>(nameBuf);
672 <span class="co">// print pid and process name</span>
673 <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);
674 }
675 }
676 }
677 }</code></pre></div>
678 <h3 id="running-the-java-code-that-uses-libproc">Running the Java code that uses libproc</h3>
679 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
680 <span class="ex">javac</span> -cp libproc.jar LibprocMain.java
681
682 <span class="ex">java</span> -cp libproc.jar:. LibprocMain</code></pre></div>
683 <h2 id="using-readline-library-from-java-code-mac-os">Using readline library from Java code (Mac OS)</h2>
684 <h3 id="jextract-a-jar-file-for-readline.h">jextract a jar file for readline.h</h3>
685 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
686 <span class="ex">jextract</span> -l readline -L /usr/local/opt/readline/lib/ --record-library-path \
687 -t org.unix \
688 /usr/include/readline/readline.h \
689 --exclude-symbols readline_echoing_p -o readline.jar</code></pre></div>
690 <h3 id="java-code-that-uses-readline">Java code that uses readline</h3>
691 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
692 <span class="kw">import</span><span class="im"> java.foreign.*;</span>
693 <span class="kw">import</span><span class="im"> java.foreign.memory.*;</span>
694 <span class="kw">import static</span><span class="im"> org.unix.readline_lib.*;</span>
695
696 <span class="kw">public</span> <span class="kw">class</span> Readline {
697 <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) {
698 <span class="co">// Scope for native allocations</span>
699 <span class="kw">try</span> (Scope s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
700 <span class="co">// allocate C memory initialized with Java string content</span>
701 var pstr = s.<span class="fu">allocateCString</span>(<span class="st">"name? "</span>);
702
703 <span class="co">// call "readline" API</span>
704 var p = <span class="fu">readline</span>(pstr);
705
706 <span class="co">// print char* as is</span>
707 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(p);
708 <span class="co">// convert char* ptr from readline as Java String & print it</span>
709 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(Pointer.<span class="fu">toString</span>(p));
710 }
711 }
712 }</code></pre></div>
713 <h3 id="running-the-java-code-that-uses-readline">Running the java code that uses readline</h3>
714 <pre><code>
715 javac -cp readline.jar Readline.java
716
717 java -cp readline.jar:. Readline
718 </code></pre>
719 <h2 id="using-libcurl-from-java-mac-os">Using libcurl from Java (Mac OS)</h2>
720 <h3 id="jextract-a-jar-for-curl.h">jextract a jar for curl.h</h3>
721 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
722 <span class="ex">jextract</span> -t org.unix -L /usr/lib -lcurl --record-library-path /usr/include/curl/curl.h -o curl.jar</code></pre></div>
723 <h3 id="java-code-that-uses-libcurl">Java code that uses libcurl</h3>
724 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
725 <span class="kw">import</span><span class="im"> java.lang.invoke.*;</span>
726 <span class="kw">import</span><span class="im"> java.foreign.*;</span>
727 <span class="kw">import</span><span class="im"> java.foreign.memory.*;</span>
728 <span class="kw">import</span><span class="im"> org.unix.curl_lib;</span>
729 <span class="kw">import static</span><span class="im"> org.unix.curl_lib.*;</span>
730 <span class="kw">import static</span><span class="im"> org.unix.easy_lib.*;</span>
731
732 <span class="kw">public</span> <span class="kw">class</span> CurlMain {
733 <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) {
734 <span class="kw">try</span> (Scope s = curl_lib.<span class="fu">scope</span>().<span class="fu">fork</span>()) {
735 <span class="fu">curl_global_init</span>(CURL_GLOBAL_DEFAULT);
736 Pointer<<span class="bu">Void</span>> curl = <span class="fu">curl_easy_init</span>();
737 <span class="kw">if</span>(!curl.<span class="fu">isNull</span>()) {
738 Pointer<<span class="bu">Byte</span>> url = s.<span class="fu">allocateCString</span>(args[<span class="dv">0</span>]);
739 <span class="fu">curl_easy_setopt</span>(curl, CURLOPT_URL, url);
740 <span class="dt">int</span> res = <span class="fu">curl_easy_perform</span>(curl);
741 <span class="kw">if</span> (res != CURLE_OK) {
742 <span class="fu">curl_easy_cleanup</span>(curl);
743 }
744 }
745 <span class="fu">curl_global_cleanup</span>();
746 }
747 }
748 }</code></pre></div>
749 <h3 id="running-the-java-code-that-uses-libcurl">Running the java code that uses libcurl</h3>
750 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
751 <span class="ex">javac</span> -cp curl.jar CurlMain.java
752 <span class="ex">java</span> -cp curl.jar:. CurlMain <span class="op"><</span>url<span class="op">></span></code></pre></div>
753 <h2 id="using-unistd.h-from-java-code-linux">Using unistd.h from Java code (Linux)</h2>
754 <h3 id="jextract-a-jar-file-for-unistd.h">jextract a jar file for unistd.h</h3>
755 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
756 <span class="ex">jextract</span> /usr/include/unistd.h -t org.unix -o unistd.jar</code></pre></div>
757 <h3 id="java-code-that-calls-getpid">Java code that calls getpid</h3>
758 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
759 <span class="kw">import</span><span class="im"> java.foreign.*;</span>
760 <span class="kw">import</span><span class="im"> java.lang.invoke.*;</span>
761 <span class="kw">import</span><span class="im"> org.unix.unistd_h;</span>
762
763
764 <span class="kw">public</span> <span class="kw">class</span> Getpid {
765 <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) {
766 <span class="co">// bind unistd interface</span>
767 var u = Libraries.<span class="fu">bind</span>(MethodHandles.<span class="fu">lookup</span>(), unistd_h.<span class="fu">class</span>);
768 <span class="co">// call getpid from the unistd.h</span>
769 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(u.<span class="fu">getpid</span>());
770 <span class="co">// check process id from Java API!</span>
771 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(ProcessHandle.<span class="fu">current</span>().<span class="fu">pid</span>());
772 }
773 }</code></pre></div>
774 <h3 id="running-the-java-code-that-uses-getpid">Running the Java code that uses getpid</h3>
775 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
776 <span class="ex">javac</span> -cp unistd.jar Getpid.java
777
778 <span class="ex">java</span> -cp unistd.jar:. Getpid</code></pre></div>
779 <h2 id="using-opengl-graphic-library-ubuntu-16.04">Using OpenGL graphic library (Ubuntu 16.04)</h2>
780 <p>OpenGL is a popular portable graphic library: <a href="https://www.opengl.org/" class="uri">https://www.opengl.org/</a></p>
781 <h3 id="installing-opengl-ubuntu-16.04">Installing OpenGL (Ubuntu 16.04)</h3>
782 <p>Installing relevant OpenGL headers and libraries can be a bit tricky, as it depends on what graphic card is installed on the target platform. The following instruction assume that the standard version of OpenGL is used (e.g. mesa), rather than a proprietary one (Nvidia or AMD), although the changes to get these working are rather small.</p>
783 <p>OpenGL is always coupled with a bunch of other libraries, namely GLU and glut. You can install all those libraries using <code>apt</code>, as follows:</p>
784 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
785 <span class="fu">sudo</span> apt-get install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev</code></pre></div>
786 <p>If the installation was successful, OpenGL headers can be found under <code>/usr/include/GL</code>, while libraries can be found in the folder <code>/usr/lib/x86_64-linux-gnu/</code>.</p>
787 <h3 id="jextracting-opengl-ubuntu-16.04">jextracting OpenGL (Ubuntu 16.04)</h3>
788 <p>To extract the opengl libraries the following command suffices:</p>
789 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
790 <span class="ex">jextract</span> -L /usr/lib/x86_64-linux-gnu -l glut -l GLU -l GL --record-library-path -t opengl -o opengl.jar /usr/include/GL/glut.h</code></pre></div>
791 <p>Since glut depends on the other libraries (GLU and GL), it is not necessary to give additional headers to jextract.</p>
792 <h3 id="java-sample-code-that-uses-the-opengl-library">Java sample code that uses the OpenGL library</h3>
793 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span>
794 <span class="kw">import</span><span class="im"> java.foreign.Scope;</span>
795 <span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span>
796 <span class="kw">import</span><span class="im"> java.foreign.memory.Pointer;</span>
797
798 <span class="kw">import static</span><span class="im"> opengl.gl_lib.*;</span>
799 <span class="kw">import static</span><span class="im"> opengl.freeglut_std_lib.*;</span>
800
801 <span class="kw">public</span> <span class="kw">class</span> Teapot {
802
803 <span class="dt">float</span> rot = <span class="dv">0</span>;
804
805 <span class="fu">Teapot</span>(Scope sc) {
806 <span class="co">// Misc Parameters</span>
807 <span class="bu">Array</span><<span class="bu">Float</span>> pos = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">FLOAT</span>, <span class="kw">new</span> <span class="dt">float</span>[] {<span class="fl">0.</span>0f, <span class="fl">15.</span>0f, -<span class="fl">15.</span>0f, <span class="dv">0</span>});
808 <span class="bu">Array</span><<span class="bu">Float</span>> spec = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">FLOAT</span>, <span class="kw">new</span> <span class="dt">float</span>[] {<span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">0</span>});
809 <span class="bu">Array</span><<span class="bu">Float</span>> shini = sc.<span class="fu">allocateArray</span>(NativeTypes.<span class="fu">FLOAT</span>, <span class="kw">new</span> <span class="dt">float</span>[] {<span class="dv">113</span>});
810
811 <span class="co">// Reset Background</span>
812 <span class="fu">glClearColor</span>(<span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">0</span>);
813
814 <span class="co">// Setup Lighting</span>
815 <span class="fu">glShadeModel</span>(GL_SMOOTH);
816 <span class="fu">glLightfv</span>(GL_LIGHT0, GL_POSITION, pos.<span class="fu">elementPointer</span>());
817 <span class="fu">glLightfv</span>(GL_LIGHT0, GL_AMBIENT, spec.<span class="fu">elementPointer</span>());
818 <span class="fu">glLightfv</span>(GL_LIGHT0, GL_DIFFUSE, spec.<span class="fu">elementPointer</span>());
819 <span class="fu">glLightfv</span>(GL_LIGHT0, GL_SPECULAR, spec.<span class="fu">elementPointer</span>());
820 <span class="fu">glMaterialfv</span>(GL_FRONT, GL_SHININESS, shini.<span class="fu">elementPointer</span>());
821 <span class="fu">glEnable</span>(GL_LIGHTING);
822 <span class="fu">glEnable</span>(GL_LIGHT0);
823 <span class="fu">glEnable</span>(GL_DEPTH_TEST);
824 }
825
826 <span class="dt">void</span> <span class="fu">display</span>() {
827 <span class="fu">glClear</span>(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
828 <span class="fu">glPushMatrix</span>();
829 <span class="fu">glRotatef</span>(-<span class="dv">20</span>, <span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">0</span>);
830 <span class="fu">glRotatef</span>(rot, <span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">0</span>);
831 <span class="fu">glutSolidTeapot</span>(<span class="fl">0.5</span>);
832 <span class="fu">glPopMatrix</span>();
833 <span class="fu">glutSwapBuffers</span>();
834 }
835
836 <span class="dt">void</span> <span class="fu">onIdle</span>() {
837 rot += <span class="fl">0.1</span>;
838 <span class="fu">glutPostRedisplay</span>();
839 }
840
841 <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) {
842 <span class="kw">try</span> (Scope sc = opengl.<span class="fu">gl_lib</span>.<span class="fu">scope</span>().<span class="fu">fork</span>()) {
843 Pointer<<span class="bu">Integer</span>> argc = sc.<span class="fu">allocate</span>(NativeTypes.<span class="fu">INT32</span>);
844 argc.<span class="fu">set</span>(<span class="dv">0</span>);
845 <span class="fu">glutInit</span>(argc, Pointer.<span class="fu">ofNull</span>());
846 <span class="fu">glutInitDisplayMode</span>(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
847 <span class="fu">glutInitWindowSize</span>(<span class="dv">900</span>, <span class="dv">900</span>);
848 <span class="fu">glutCreateWindow</span>(sc.<span class="fu">allocateCString</span>(<span class="st">"Hello Panama!"</span>));
849 Teapot teapot = <span class="kw">new</span> <span class="fu">Teapot</span>(sc);
850 <span class="fu">glutDisplayFunc</span>(sc.<span class="fu">allocateCallback</span>(teapot::display));
851 <span class="fu">glutIdleFunc</span>(sc.<span class="fu">allocateCallback</span>(teapot::onIdle));
852 <span class="fu">glutMainLoop</span>();
853 }
854 }
855 }</code></pre></div>
856 <h3 id="running-the-java-code-that-uses-opengl-ubuntu-16.04">Running the Java code that uses OpenGL (Ubuntu 16.04)</h3>
857 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
858 <span class="ex">javac</span> -cp opengl.jar Teapot.java
859
860 <span class="ex">java</span> -cp opengl.jar:. Teapot</code></pre></div>
861 <h2 id="using-opengl-graphic-library-windows">Using OpenGL graphic library (Windows)</h2>
862 <h3 id="installing-opengl">Installing OpenGL</h3>
863 <p>Download the freeglut package for MSVC at <a href="https://www.transmissionzero.co.uk/software/freeglut-devel/" class="uri">https://www.transmissionzero.co.uk/software/freeglut-devel/</a></p>
864 <p>Extract the freeglut zip.</p>
865 <h3 id="jextracting-opengl">jextracting OpenGL</h3>
866 <p>Navigate to the root directory of the extracted zip and run the following commands:</p>
867 <pre class="powershell"><code>$inc = "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0"
868 jextract -L C:\Windows\System32\ -L .\freeglut\bin\x64\ -l opengl32 -l freeglut -t opengl -o opengl.jar --package-map "$inc\um\gl=opengl" --record-library-path .\freeglut\include\GL\glut.h</code></pre>
869 <p>The directory that is assigned to <code>$inc</code> is an example, and is system dependent. Make sure that the build number at the end of the path (in this case <code>10.0.17134.0</code>) is the latest one found in the parent folder (<code>C:\Program Files (x86)\Windows Kits\10\Include\</code>).</p>
870 <p>There are a bunch of warnings generated, but as long as the jar file is generated in the working directory the extraction was successful.</p>
871 <h3 id="java-sample-code-that-uses-the-opengl-library-1">Java sample code that uses the OpenGL library</h3>
872 <p>This is the same as in the Ubuntu section</p>
873 <h3 id="running-the-java-code-that-uses-opengl">Running the Java code that uses OpenGL</h3>
874 <pre class="powershell"><code>javac -cp .\opengl.jar Teapot.java
875 java -cp "opengl.jar;." Teapot</code></pre>
876 <h2 id="using-tensorflow-c-api-mac-os">Using TensorFlow C API (Mac OS)</h2>
877 <p>Quoted from <a href="https://www.tensorflow.org/install/lang_c" class="uri">https://www.tensorflow.org/install/lang_c</a></p>
878 <p>"TensorFlow provides a C API that can be used to build bindings for other languages. The API is defined in c_api.h and designed for simplicity and uniformity rather than convenience."</p>
879 <h3 id="installing-libtensorflow">Installing libtensorflow</h3>
880 <p>You can follow the setup procedure as described in the above page.</p>
881 <p>Alternatively, on Mac, you can install libtensorflow using HomeBrew</p>
882 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
883 <span class="ex">brew</span> install libtensorflow</code></pre></div>
884 <p>Tensorflow ship the libtensorflow with an .so extension, this doesn't work well for java on MacOS as java expect .dylib extension. To work around this, create a symbolic link.</p>
885 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
886 <span class="fu">sudo</span> ln -s /usr/local/lib/libtensorflow.so /usr/local/lib/libtensorflow.dylib</code></pre></div>
887 <h3 id="jextracting-libtensorflow-c_api.h">jextracting libtensorflow c_api.h</h3>
888 <p>The following command can be used to extract c_api.h.</p>
889 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
890 <span class="ex">jextract</span> -C -x -C c++ \
891 -L /usr/local/lib -l tensorflow --record-library-path \
892 -o tf.jar -t org.tensorflow.panama \
893 /usr/local/include/tensorflow/c/c_api.h</code></pre></div>
894 <p>The caveat to extract tensorflow C API is that it declare function prototype without argument in C++ style, for example, TF_Version(), which is considered incomplete C function prototype instead of C style as in TF_Version(void). An incomplete function prototype will become vararg funciton. To avoid that, we need to pass clang '-x c++' options to jextract with '-C -x -C c++'</p>
895 <h3 id="java-sample-code-that-uses-tensorflow-library">Java sample code that uses tensorflow library</h3>
896 <div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java">
897 <span class="kw">import</span><span class="im"> java.foreign.NativeTypes;</span>
898 <span class="kw">import</span><span class="im"> java.foreign.Scope;</span>
899 <span class="kw">import</span><span class="im"> java.foreign.memory.Array;</span>
900 <span class="kw">import</span><span class="im"> java.foreign.memory.LayoutType;</span>
901 <span class="kw">import</span><span class="im"> java.foreign.memory.Pointer;</span>
902 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_DataType;</span>
903 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Graph;</span>
904 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Operation;</span>
905 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_OperationDescription;</span>
906 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Output;</span>
907 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Session;</span>
908 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_SessionOptions;</span>
909 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Status;</span>
910 <span class="kw">import</span><span class="im"> org.tensorflow.panama.c_api_h.TF_Tensor;</span>
911
912 <span class="kw">import static</span><span class="im"> org.tensorflow.panama.c_api_lib.*;</span>
913 <span class="kw">import static</span><span class="im"> org.tensorflow.panama.c_api_lib.TF_DataType.*;</span>
914
915 <span class="kw">public</span> <span class="kw">class</span> TensorFlowExample {
916 <span class="dt">static</span> Pointer<TF_Operation> <span class="fu">PlaceHolder</span>(Pointer<TF_Graph> graph, Pointer<TF_Status> status,
917 <span class="at">@TF_DataType</span> <span class="dt">int</span> dtype, <span class="bu">String</span> name) {
918 <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
919 Pointer<TF_OperationDescription> desc = <span class="fu">TF_NewOperation</span>(graph,
920 s.<span class="fu">allocateCString</span>(<span class="st">"Placeholder"</span>), s.<span class="fu">allocateCString</span>(name));
921 <span class="fu">TF_SetAttrType</span>(desc, s.<span class="fu">allocateCString</span>(<span class="st">"dtype"</span>), TF_FLOAT);
922 <span class="kw">return</span> <span class="fu">TF_FinishOperation</span>(desc, status);
923 }
924 }
925
926 <span class="dt">static</span> Pointer<TF_Operation> <span class="fu">ConstValue</span>(Pointer<TF_Graph> graph, Pointer<TF_Status> status,
927 Pointer<TF_Tensor> tensor, <span class="bu">String</span> name) {
928 <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
929 Pointer<TF_OperationDescription> desc = <span class="fu">TF_NewOperation</span>(graph,
930 s.<span class="fu">allocateCString</span>(<span class="st">"Const"</span>), s.<span class="fu">allocateCString</span>(name));
931 <span class="fu">TF_SetAttrTensor</span>(desc, s.<span class="fu">allocateCString</span>(<span class="st">"value"</span>), tensor, status);
932 <span class="fu">TF_SetAttrType</span>(desc, s.<span class="fu">allocateCString</span>(<span class="st">"dtype"</span>), <span class="fu">TF_TensorType</span>(tensor));
933 <span class="kw">return</span> <span class="fu">TF_FinishOperation</span>(desc, status);
934 }
935 }
936
937 <span class="dt">static</span> Pointer<TF_Operation> <span class="fu">Add</span>(Pointer<TF_Graph> graph, Pointer<TF_Status> status,
938 Pointer<TF_Operation> one, Pointer<TF_Operation> two,
939 <span class="bu">String</span> name) {
940 <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
941 Pointer<TF_OperationDescription> desc = <span class="fu">TF_NewOperation</span>(graph,
942 s.<span class="fu">allocateCString</span>(<span class="st">"AddN"</span>), s.<span class="fu">allocateCString</span>(name));
943 <span class="bu">Array</span><TF_Output> add_inputs = s.<span class="fu">allocateArray</span>(
944 LayoutType.<span class="fu">ofStruct</span>(TF_Output.<span class="fu">class</span>),<span class="dv">2</span>);
945 add_inputs.<span class="fu">get</span>(<span class="dv">0</span>).<span class="fu">oper</span>$<span class="fu">set</span>(one);
946 add_inputs.<span class="fu">get</span>(<span class="dv">0</span>).<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);
947 add_inputs.<span class="fu">get</span>(<span class="dv">1</span>).<span class="fu">oper</span>$<span class="fu">set</span>(two);
948 add_inputs.<span class="fu">get</span>(<span class="dv">1</span>).<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);
949 <span class="fu">TF_AddInputList</span>(desc, add_inputs.<span class="fu">elementPointer</span>(), <span class="dv">2</span>);
950 <span class="kw">return</span> <span class="fu">TF_FinishOperation</span>(desc, status);
951 }
952 }
953
954 <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><span class="kw">... </span>args) {
955 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"TensorFlow C library version: "</span> + Pointer.<span class="fu">toString</span>(<span class="fu">TF_Version</span>()));
956
957 Pointer<TF_Graph> graph = <span class="fu">TF_NewGraph</span>();
958 Pointer<TF_SessionOptions> options = <span class="fu">TF_NewSessionOptions</span>();
959 Pointer<TF_Status> status = <span class="fu">TF_NewStatus</span>();
960 Pointer<TF_Session> session = <span class="fu">TF_NewSession</span>(graph, options, status);
961
962 <span class="dt">float</span> in_val_one = <span class="fl">4.</span>0f;
963 <span class="dt">float</span> const_two = <span class="fl">2.</span>0f;
964
965 Pointer<TF_Tensor> tensor_in = <span class="fu">TF_AllocateTensor</span>(TF_FLOAT, Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>, <span class="bu">Float</span>.<span class="fu">BYTES</span>);
966 <span class="fu">TF_TensorData</span>(tensor_in).<span class="fu">cast</span>(NativeTypes.<span class="fu">FLOAT</span>).<span class="fu">set</span>(in_val_one);
967 Pointer<TF_Tensor> tensor_const_two = <span class="fu">TF_AllocateTensor</span>(TF_FLOAT, Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>, <span class="bu">Float</span>.<span class="fu">BYTES</span>);
968 <span class="fu">TF_TensorData</span>(tensor_const_two).<span class="fu">cast</span>(NativeTypes.<span class="fu">FLOAT</span>).<span class="fu">set</span>(const_two);
969
970 <span class="co">// Operations</span>
971 Pointer<TF_Operation> feed = <span class="fu">PlaceHolder</span>(graph, status, TF_FLOAT, <span class="st">"feed"</span>);
972 Pointer<TF_Operation> two = <span class="fu">ConstValue</span>(graph, status, tensor_const_two, <span class="st">"const"</span>);
973 Pointer<TF_Operation> add = <span class="fu">Add</span>(graph, status, feed, two, <span class="st">"add"</span>);
974
975
976 <span class="kw">try</span> (var s = <span class="fu">scope</span>().<span class="fu">fork</span>()) {
977 var ltPtrTensor = LayoutType.<span class="fu">ofStruct</span>(TF_Tensor.<span class="fu">class</span>).<span class="fu">pointer</span>();
978
979 <span class="co">// Session Inputs</span>
980 TF_Output input_operations = s.<span class="fu">allocateStruct</span>(TF_Output.<span class="fu">class</span>);
981 input_operations.<span class="fu">oper</span>$<span class="fu">set</span>(feed);
982 input_operations.<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);
983 Pointer<Pointer<TF_Tensor>> input_tensors = s.<span class="fu">allocate</span>(ltPtrTensor);
984 input_tensors.<span class="fu">set</span>(tensor_in);
985
986 <span class="co">// Session Outputs</span>
987 TF_Output output_operations = s.<span class="fu">allocateStruct</span>(TF_Output.<span class="fu">class</span>);
988 output_operations.<span class="fu">oper</span>$<span class="fu">set</span>(add);
989 output_operations.<span class="fu">index</span>$<span class="fu">set</span>(<span class="dv">0</span>);
990 Pointer<Pointer<TF_Tensor>> output_tensors = s.<span class="fu">allocate</span>(ltPtrTensor);
991 <span class="fu">TF_SessionRun</span>(session, Pointer.<span class="fu">ofNull</span>(),
992 <span class="co">// Inputs</span>
993 input_operations.<span class="fu">ptr</span>(), input_tensors, <span class="dv">1</span>,
994 <span class="co">// Outputs</span>
995 output_operations.<span class="fu">ptr</span>(), output_tensors, <span class="dv">1</span>,
996 <span class="co">// Target operations</span>
997 Pointer.<span class="fu">ofNull</span>(), <span class="dv">0</span>, Pointer.<span class="fu">ofNull</span>(),
998 status);
999
1000 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="bu">String</span><span class="fu">.format</span>(<span class="st">"Session Run Status: </span><span class="sc">%d</span><span class="st"> - </span><span class="sc">%s</span><span class="st">"</span>,
1001 <span class="fu">TF_GetCode</span>(status), Pointer.<span class="fu">toString</span>(<span class="fu">TF_Message</span>(status))));
1002 Pointer<TF_Tensor> tensor_out = output_tensors.<span class="fu">get</span>();
1003 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Output Tensor Type: "</span> + <span class="fu">TF_TensorType</span>(tensor_out));
1004 <span class="dt">float</span> outval = <span class="fu">TF_TensorData</span>(tensor_out).<span class="fu">cast</span>(NativeTypes.<span class="fu">FLOAT</span>).<span class="fu">get</span>();
1005 <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Output Tensor Value: "</span> + outval);
1006
1007 <span class="fu">TF_CloseSession</span>(session, status);
1008 <span class="fu">TF_DeleteSession</span>(session, status);
1009
1010 <span class="fu">TF_DeleteSessionOptions</span>(options);
1011
1012 <span class="fu">TF_DeleteGraph</span>(graph);
1013
1014 <span class="fu">TF_DeleteTensor</span>(tensor_in);
1015 <span class="fu">TF_DeleteTensor</span>(tensor_out);
1016 <span class="fu">TF_DeleteTensor</span>(tensor_const_two);
1017
1018 <span class="fu">TF_DeleteStatus</span>(status);
1019 }
1020 }
1021 }</code></pre></div>
1022 <h3 id="compiling-and-running-the-above-tensorflow-sample">Compiling and running the above TensorFlow sample</h3>
1023 <div class="sourceCode"><pre class="sourceCode sh"><code class="sourceCode bash">
1024 <span class="ex">javac</span> -cp tf.jar TensorFlowExample.java
1025
1026 <span class="ex">java</span> -cp tf.jar:. TensorFlowExample</code></pre></div>
1027 <h2 id="using-tensorflow-c-api-windows">Using TensorFlow C API (Windows)</h2>
1028 <h3 id="installing-libtensorflow-1">Installing libtensorflow</h3>
1029 <p>You can download a binary distribution from <a href="https://www.tensorflow.org/install/lang_c" class="uri">https://www.tensorflow.org/install/lang_c</a></p>
1030 <p>Extract the zip file.</p>
1031 <h3 id="jextracting-libtensorflow-c_api.h-1">jextracting libtensorflow c_api.h</h3>
1032 <p>The problem outlined in the Mac OS instruction w.r.t. incorrect function prototypes still exists (though it has been solved in the Tensorflow github repository, this change has not yet made it into the binary distributions). On Windows there is however no jextract command that works around this, so the only way to extract the api.h header successfully is to first manually fix the incorrect function prototypes:</p>
1033 <div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">TF_Version() -> TF_Version(<span class="dt">void</span>)
1034 TF_NewGraph() -> TF_NewGraph(<span class="dt">void</span>)
1035 TF_NewSessionOptions() -> TF_NewSessionOptions(<span class="dt">void</span>)
1036 TF_NewStatus() -> TF_NewStatus(<span class="dt">void</span>)
1037 TF_NewBuffer() -> TF_NewBuffer(<span class="dt">void</span>)
1038 TF_NewImportGraphDefOptions() -> TF_NewImportGraphDefOptions(<span class="dt">void</span>)
1039 TF_GetAllOpList() -> TF_GetAllOpList(<span class="dt">void</span>)</code></pre></div>
1040 <p>Once you've done this you can use the following jextract command from the libtensorflow root directory:</p>
1041 <pre class="powershell"><code>jextract -L .\lib -l tensorflow -o tf.jar -t "org.tensorflow.panama" --record-library-path .\include\tensorflow\c\c_api.h</code></pre>
1042 <h3 id="java-sample-code-that-uses-tensorflow-library-1">Java sample code that uses tensorflow library</h3>
1043 <p>This is the same as for the Mac OS section.</p>
1044 <h3 id="compiling-and-running-the-above-tensorflow-sample-1">Compiling and running the above TensorFlow sample</h3>
1045 <pre class="powershell"><code>javac -cp tf.jar TensorFlowExample.java
1046 java -cp "tf.jar;." TensorFlowExample</code></pre>
1047 </body>
1048 </html>
|