<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tlrobinson.net / blog &#187; Java</title>
	<atom:link href="http://tlrobinson.net/blog/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://tlrobinson.net/blog</link>
	<description></description>
	<lastBuildDate>Mon, 06 Apr 2009 08:37:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='tlrobinson.net' port='80' path='/blog/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>Embedding and loading a JNI library from a jar</title>
		<link>http://tlrobinson.net/blog/2009/03/09/embedding-and-loading-a-jni-library-from-a-jar/</link>
		<comments>http://tlrobinson.net/blog/2009/03/09/embedding-and-loading-a-jni-library-from-a-jar/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 08:05:47 +0000</pubDate>
		<dc:creator>Tom</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://tlrobinson.net/blog/?p=85</guid>
		<description><![CDATA[When I searched for ways to load a JNI library from a jar there were numerous hints of how to do it, but no code that I could find. So here&#8217;s my solution:

import java.net.URL;
import java.util.zip.ZipFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

public abstract class UnixDomainSocket {

&#160;&#160;&#160;&#160;static {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// get the class object for this class, and get the location [...]]]></description>
			<content:encoded><![CDATA[<p>When I searched for ways to load a JNI library from a jar there were numerous <a href="http://forums.sun.com/thread.jspa?threadID=393971">hints</a> of how to do it, but no code that I could find. So here&#8217;s my solution:</p>

<div style="text-align:left;color:#000000; background-color:#ffffff; border:solid black 1px; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; "><span style="color:#881350;">import</span><span style="color:#683821;"> java.net.URL;</span><br />
<span style="color:#881350;">import</span><span style="color:#683821;"> java.util.zip.ZipFile;</span><br />
<span style="color:#881350;">import</span><span style="color:#683821;"> java.io.File;</span><br />
<span style="color:#881350;">import</span><span style="color:#683821;"> java.io.FileOutputStream;</span><br />
<span style="color:#881350;">import</span><span style="color:#683821;"> java.io.InputStream;</span><br />
<br />
<span style="color:#881350;">public</span> <span style="color:#881350;">abstract</span> <span style="color:#881350;">class</span> UnixDomainSocket {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">static</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">try</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#236e25;">// get the class object for this class, and get the location of it<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">final</span> <span style="color:#440088;">Class</span> c = UnixDomainSocket.class;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">final</span> <span style="color:#440088;">URL</span> location = c.<span style="color:#003369;">getProtectionDomain</span>().<span style="color:#003369;">getCodeSource</span>().<span style="color:#003369;">getLocation</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#236e25;">// jars are just zip files, get the input stream for the lib<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#440088;">ZipFile</span> zf = <span style="color:#881350;">new</span> <span style="color:#440088;">ZipFile</span>(location.<span style="color:#003369;">getPath</span>());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#440088;">InputStream</span> in = zf.<span style="color:#003369;">getInputStream</span>(zf.<span style="color:#003369;">getEntry</span>(<span style="color:#760f15;">&quot;libunixdomainsocket.jnilib&quot;</span>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#236e25;">// create a temp file and an input stream for it<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#440088;">File</span> f = File.<span style="color:#003369;">createTempFile</span>(<span style="color:#760f15;">&quot;JARLIB-&quot;</span>, <span style="color:#760f15;">&quot;-libunixdomainsocket.jnilib&quot;</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#440088;">FileOutputStream</span> out = <span style="color:#881350;">new</span> <span style="color:#440088;">FileOutputStream</span>(f);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#236e25;">// copy the lib to the temp file<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">byte</span>[] buf = <span style="color:#881350;">new</span> <span style="color:#881350;">byte</span>[<span style="color:#0000ff;">1024</span>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">int</span> len;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#881350;">while</span><span style="color:#003369;"> </span>((len = in.<span style="color:#003369;">read</span>(buf)) &gt; <span style="color:#0000ff;">0</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.<span style="color:#003369;">write</span>(buf, <span style="color:#0000ff;">0</span>, len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.<span style="color:#003369;">close</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.<span style="color:#003369;">close</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#236e25;">// load the lib specified by it&#8217;s absolute path and delete it<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.<span style="color:#003369;">load</span>(f.<span style="color:#003369;">getAbsolutePath</span>());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.<span style="color:#003369;">delete</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <span style="color:#881350;">catch</span><span style="color:#003369;"> </span>(<span style="color:#440088;">Exception</span> e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.<span style="color:#003369;">printStackTrace</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.<span style="color:#003369;">exit</span>(<span style="color:#0000ff;">1</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#236e25;">// &#8230;<br />
</span>}</div>

<p>This particular example is for <a href="http://code.google.com/p/juds/">JUDS</a>.</p>

<p>It could be extended to load one of several libraries for different architectures, .jnilib or .dylib for Mac OS X, .so for Linux, and .dll for Windows.</p>

<p>This seems like a lot of hoops to jump through, but I couldn&#8217;t find an easier way to do it. If you know of a better way, please let me know in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://tlrobinson.net/blog/2009/03/09/embedding-and-loading-a-jni-library-from-a-jar/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
