﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-bigbear</title><link>http://www.blogjava.net/bigbear/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 18 May 2026 18:36:10 GMT</lastBuildDate><pubDate>Mon, 18 May 2026 18:36:10 GMT</pubDate><ttl>60</ttl><item><title>JNA实现Java调用Fortran（f77）</title><link>http://www.blogjava.net/bigbear/archive/2010/05/12/320749.html</link><dc:creator>大熊</dc:creator><author>大熊</author><pubDate>Wed, 12 May 2010 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/bigbear/archive/2010/05/12/320749.html</guid><wfw:comment>http://www.blogjava.net/bigbear/comments/320749.html</wfw:comment><comments>http://www.blogjava.net/bigbear/archive/2010/05/12/320749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bigbear/comments/commentRss/320749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bigbear/services/trackbacks/320749.html</trackback:ping><description><![CDATA[在成功实现Java调用C++之后，接下来想到能否通过JNA实现Java调用Fortran，今天试验了一下，还是比较容易的。<br />
<br />
网上有一个Java调用F95的例子，但是我考虑不仅要实现F95的调用，还要实现F77的调用，所以费了一些周折。<br />
<br />
问题的关键在于F77为过程名自动添加了一个尾部的下划线，所以sub1这个过程，到Java一端，就变成了sub1_，知道了这一点，后面就简单了。<br />
<br />
1、创建一个动态链接库项目FortranDLL，新建一个简单的fortran源程序for1.f：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subroutine sub1(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTEGER i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRINT*, "SUB1 CALLED"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRINT*, i<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END subroutine<br />
编译代码生成libFortranDLL.dll。<br />
<br />
2、新建一个Java项目，包含JNA库<br />
创建一个动态库接口代码FLib.java：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.jna.Library;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.jna.ptr.ByReference;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img id="Codehighlighter1_103_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_137_Open_Text.style.display='none'; Codehighlighter1_103_137_Closed_Image.style.display='inline'; Codehighlighter1_103_137_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_103_137_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_103_137_Closed_Text.style.display='none'; Codehighlighter1_103_137_Open_Image.style.display='inline'; Codehighlighter1_103_137_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;FLib&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Library&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_103_137_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_103_137_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sub1_(ByReference&nbsp;&nbsp;i);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<br />
创建一个主程序Main.java<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.jna.Native;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.jna.ptr.IntByReference;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img id="Codehighlighter1_85_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_85_334_Open_Text.style.display='none'; Codehighlighter1_85_334_Closed_Image.style.display='inline'; Codehighlighter1_85_334_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_85_334_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_85_334_Closed_Text.style.display='none'; Codehighlighter1_85_334_Open_Image.style.display='inline'; Codehighlighter1_85_334_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Main&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_85_334_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_85_334_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img id="Codehighlighter1_131_332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_131_332_Open_Text.style.display='none'; Codehighlighter1_131_332_Closed_Image.style.display='inline'; Codehighlighter1_131_332_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_131_332_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_131_332_Closed_Text.style.display='none'; Codehighlighter1_131_332_Open_Image.style.display='inline'; Codehighlighter1_131_332_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_131_332_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_131_332_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Loading&nbsp;dynamically&nbsp;the&nbsp;library</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FLib&nbsp;lib2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(FLib)&nbsp;Native.loadLibrary(</span><span style="color: #000000">"</span><span style="color: #000000">libFortranDLL</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;FLib.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntByReference&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IntByReference(</span><span style="color: #000000">1234</span><span style="color: #000000">);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib2.sub1_(a);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<br />
注意，关键在于接口当中的sub_这个命名规则，否则无法找到找到指定过程，另外默认情况下，fortran使用引用参数，所以不能简单实用int作为参数，必须实用引用参数。<br />
<br />
运行程序，得到如下结果：<br />
<br />
run：<br />
&nbsp;SUB1 CALLED<br />
&nbsp;1234<br />
成功生成（总时间：1 秒）<br />
<br />
3、G95的调用更简单一些，可以直接使用bind指定输出过程（函数）名，可以完全不必考虑编译器的命名规则，比f77的方式可移植性更好一些。<br />
<br />
可以参考这里：http://www.javaforge.com/wiki/66061
<img src ="http://www.blogjava.net/bigbear/aggbug/320749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bigbear/" target="_blank">大熊</a> 2010-05-12 22:05 <a href="http://www.blogjava.net/bigbear/archive/2010/05/12/320749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNA实现Java调用C++动态链接库</title><link>http://www.blogjava.net/bigbear/archive/2010/05/11/JNAExample.html</link><dc:creator>大熊</dc:creator><author>大熊</author><pubDate>Tue, 11 May 2010 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/bigbear/archive/2010/05/11/JNAExample.html</guid><wfw:comment>http://www.blogjava.net/bigbear/comments/320562.html</wfw:comment><comments>http://www.blogjava.net/bigbear/archive/2010/05/11/JNAExample.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bigbear/comments/commentRss/320562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bigbear/services/trackbacks/320562.html</trackback:ping><description><![CDATA[<p>今天偶然看到了JNA的介绍，下载下来试了一下，很好用，相比较JNI要简单很多。做了一个可以callback的c++动态链接库，实现了java和c++的互相调用。</p>
<p>&nbsp;<strong>1、开发环境：</strong></p>
<p>&nbsp;开发工具：Netbeans 6.8，包含了Java和C++开发插件，用一个工具比较方便，可以同时开发C++的dll和Java代码。</p>
<p>C++环境：MingW 5.1.6+MSYS、g++ 3.4.5</p>
<p>Java环境：JDK 1.6.0_18</p>
<p>&nbsp;<strong>2、C++代码</strong></p>
<p>&nbsp;用Netbeans创建一个动态链接库项目JNALib，创建一个c++源文件clib.cpp，生成结果为libJNALib.dll<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img id="Codehighlighter1_73_401_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_401_Open_Text.style.display='none'; Codehighlighter1_73_401_Closed_Image.style.display='inline'; Codehighlighter1_73_401_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_73_401_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_73_401_Closed_Text.style.display='none'; Codehighlighter1_73_401_Open_Image.style.display='inline'; Codehighlighter1_73_401_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_73_401_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_401_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">OpenFunc)(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;OpenFunc&nbsp;openfunc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_183_252_Open_Image" onclick="this.style.display='none'; Codehighlighter1_183_252_Open_Text.style.display='none'; Codehighlighter1_183_252_Closed_Image.style.display='inline'; Codehighlighter1_183_252_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_183_252_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_183_252_Closed_Text.style.display='none'; Codehighlighter1_183_252_Open_Image.style.display='inline'; Codehighlighter1_183_252_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(OpenFunc&nbsp;func)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_183_252_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_183_252_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">init&nbsp;called</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openfunc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;func;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_271_399_Open_Image" onclick="this.style.display='none'; Codehighlighter1_271_399_Open_Text.style.display='none'; Codehighlighter1_271_399_Closed_Image.style.display='inline'; Codehighlighter1_271_399_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_271_399_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_271_399_Closed_Text.style.display='none'; Codehighlighter1_271_399_Open_Image.style.display='inline'; Codehighlighter1_271_399_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;test()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_271_399_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_271_399_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_303_361_Open_Image" onclick="this.style.display='none'; Codehighlighter1_303_361_Open_Text.style.display='none'; Codehighlighter1_303_361_Closed_Image.style.display='inline'; Codehighlighter1_303_361_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_303_361_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_303_361_Closed_Text.style.display='none'; Codehighlighter1_303_361_Open_Image.style.display='inline'; Codehighlighter1_303_361_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(openfunc&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_303_361_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_303_361_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">openfunc&nbsp;is&nbsp;NULL</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">openfunc)(</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p>注意：其中OpenFunc声明了一个回调类型，也就是一个函数指针，可以通过init将java中的OpenFunc方法传递进来，设置这个函数指针，如此一来，可以实现C++到Java的回调。</p>
<p>&nbsp;<strong>3、Java代码</strong></p>
<p>&nbsp;创建一个Java项目JNADemo，创建一个包clibtest，创建以下java代码：</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;clibtest;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.jna.Callback;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.jna.Library;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img id="Codehighlighter1_115_269_Open_Image" onclick="this.style.display='none'; Codehighlighter1_115_269_Open_Text.style.display='none'; Codehighlighter1_115_269_Closed_Image.style.display='inline'; Codehighlighter1_115_269_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_115_269_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_115_269_Closed_Text.style.display='none'; Codehighlighter1_115_269_Open_Image.style.display='inline'; Codehighlighter1_115_269_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;CLib&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Library</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_115_269_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_115_269_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_165_216_Open_Image" onclick="this.style.display='none'; Codehighlighter1_165_216_Open_Text.style.display='none'; Codehighlighter1_165_216_Closed_Image.style.display='inline'; Codehighlighter1_165_216_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_165_216_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_165_216_Closed_Text.style.display='none'; Codehighlighter1_165_216_Open_Image.style.display='inline'; Codehighlighter1_165_216_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;OpenFunc&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Callback&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_165_216_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_165_216_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;invoke(String&nbsp;filename,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(OpenFunc&nbsp;openfunc);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;test();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br />
&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;clibtest;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.jna.Native;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img id="Codehighlighter1_66_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_481_Open_Text.style.display='none'; Codehighlighter1_66_481_Closed_Image.style.display='inline'; Codehighlighter1_66_481_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_66_481_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_66_481_Closed_Text.style.display='none'; Codehighlighter1_66_481_Open_Image.style.display='inline'; Codehighlighter1_66_481_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;hello&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_66_481_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_66_481_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_112_479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_479_Open_Text.style.display='none'; Codehighlighter1_112_479_Closed_Image.style.display='inline'; Codehighlighter1_112_479_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_112_479_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_112_479_Closed_Text.style.display='none'; Codehighlighter1_112_479_Open_Image.style.display='inline'; Codehighlighter1_112_479_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_112_479_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_112_479_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Loading&nbsp;dynamically&nbsp;the&nbsp;library</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLib&nbsp;lib&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(CLib)&nbsp;Native.loadLibrary(</span><span style="color: #000000">"</span><span style="color: #000000">libJNALib</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;CLib.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_266_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_266_450_Open_Text.style.display='none'; Codehighlighter1_266_450_Closed_Image.style.display='inline'; Codehighlighter1_266_450_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_266_450_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_266_450_Closed_Text.style.display='none'; Codehighlighter1_266_450_Open_Image.style.display='inline'; Codehighlighter1_266_450_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib.init(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CLib.OpenFunc()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_266_450_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_266_450_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_324_440_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_440_Open_Text.style.display='none'; Codehighlighter1_324_440_Closed_Image.style.display='inline'; Codehighlighter1_324_440_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_324_440_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_324_440_Closed_Text.style.display='none'; Codehighlighter1_324_440_Open_Image.style.display='inline'; Codehighlighter1_324_440_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;invoke(String&nbsp;filename,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_324_440_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_324_440_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">callback&nbsp;called.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(filename);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib.test();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;<wbr></p>
<p><strong>4、项目结构如下</strong></p>
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/bigbear/FileStru.png" width="226" height="361" /><br />
<br />
<strong>5、编译C++项目，生成libJNALib.dll，拷贝到JNADemo主目录，目录结构如下：</strong><br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/bigbear/ProjStru.png" width="227" height="342" /><br />
<strong>6、运行程序，结果如下：</strong><br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/bigbear/Result.png" width="300" height="144" /><br />
<img src ="http://www.blogjava.net/bigbear/aggbug/320562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bigbear/" target="_blank">大熊</a> 2010-05-11 10:51 <a href="http://www.blogjava.net/bigbear/archive/2010/05/11/JNAExample.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>