﻿<?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-林志斌的博客-随笔分类-JAVA天地</title><link>http://www.blogjava.net/alvin/category/16873.html</link><description>超级大菜鸟，每天要自强！</description><language>zh-cn</language><lastBuildDate>Sun, 22 May 2011 18:34:16 GMT</lastBuildDate><pubDate>Sun, 22 May 2011 18:34:16 GMT</pubDate><ttl>60</ttl><item><title>从千千静听的歌词服务器查询音乐的 LRC 歌词 [Java]</title><link>http://www.blogjava.net/alvin/archive/2011/05/02/java-ttplayer-lrc-get.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Mon, 02 May 2011 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2011/05/02/java-ttplayer-lrc-get.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/349387.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2011/05/02/java-ttplayer-lrc-get.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/349387.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/349387.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近要搞这个，百度一下，发现有 php 版本的代码，搞来翻译一下。 <br>.....&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2011/05/02/java-ttplayer-lrc-get.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/349387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2011-05-02 16:50 <a href="http://www.blogjava.net/alvin/archive/2011/05/02/java-ttplayer-lrc-get.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]Java 农历</title><link>http://www.blogjava.net/alvin/archive/2008/12/30/249045.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Mon, 29 Dec 2008 19:17:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2008/12/30/249045.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/249045.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2008/12/30/249045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/249045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/249045.html</trackback:ping><description><![CDATA[一个计算农历相关信息的 Java 类.<br />
下面是利用此类做的一个月历例子.<br />
<img border="0" alt="" src="attachments/2008_10_14_23_05_43_25.jpg" /><br />
源文件:<a href="attachments/2008_10_14_23_06_16_26.rar"><img style="margin: 0px 2px -4px 0px;" border="0" alt="" src="editor/images/download.gif" />点击下载</a><br />
文章来源:&nbsp;
<a href="http://www.ialvin.cn/blog/article-150.xml">http://www.ialvin.cn/blog/article-150.xml</a>
<img src ="http://www.blogjava.net/alvin/aggbug/249045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2008-12-30 03:17 <a href="http://www.blogjava.net/alvin/archive/2008/12/30/249045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]简易 JSP 论坛源码</title><link>http://www.blogjava.net/alvin/archive/2008/12/30/249042.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Mon, 29 Dec 2008 19:17:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2008/12/30/249042.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/249042.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2008/12/30/249042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/249042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/249042.html</trackback:ping><description><![CDATA[<p>
又一个课程设计 简单的 JSP 论坛<br />
功能较简单的那种, 界面上模仿了 Discuz<br />
JSP 本来就学的不行, 只是尽量实现了 MVC<br />
<br />
源码下载:<a href="http://www.iscripts.org/bbs/viewthread.php?tid=87">http://www.iscripts.org/bbs/viewthread.php?tid=87</a><br />
<img border="0" alt="" src="http://www.ialvin.cn/blog/attachments/2008_10_14_23_32_05_28.jpg" /></p>
<p><br />
文章来源:<a href="http://www.iscripts.org/bbs/viewthread.php?tid=87">http://www.iscripts.org/bbs/viewthread.php?tid=87</a></p><img src ="http://www.blogjava.net/alvin/aggbug/249042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2008-12-30 03:17 <a href="http://www.blogjava.net/alvin/archive/2008/12/30/249042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTree使用经验总结</title><link>http://www.blogjava.net/alvin/archive/2007/10/16/153137.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Mon, 15 Oct 2007 20:11:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2007/10/16/153137.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/153137.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2007/10/16/153137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/153137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/153137.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在实际开发过程中会经常使用JTree组件，平时会遇到这样或那样的问题，在此将偶得一点经验写下来，与大家共享，希望对大家有所帮助。<br>......<br><br>在实际开发过程中会经常使用JTree组件，平时会遇到这样或那样的问题，在此将偶得一点经验写下来，与大家共享，希望对大家有所帮助。&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2007/10/16/153137.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/153137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2007-10-16 04:11 <a href="http://www.blogjava.net/alvin/archive/2007/10/16/153137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用纯真IP数据库,通过IP查地址[JAVA]</title><link>http://www.blogjava.net/alvin/archive/2007/08/23/141139.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Thu, 23 Aug 2007 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2007/08/23/141139.html</guid><description><![CDATA[这个东东可以让你通过IP查询地址(代码修改自一个 VBS 的 TQQWry 类)<br />
<div class="UBBPanel">
<div class="UBBTitle"><img style="margin: 0px 2px -3px 0px" alt="程序代码" src="http://www.pkpk.org/blog/images/code.gif" /> 程序代码</div>
<div class="UBBContent">package alvin;<br />
import java.io.*;<br />
<br />
public class QQWry {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String DbPath = "F:\\DB\\QQWry2.Dat";&nbsp;&nbsp;&nbsp;&nbsp;//纯真IP数据库地址<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String Country, LocalStr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private long IPN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private int RecordCount, CountryFlag;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private long RangE, RangB, OffSet, StartIP, EndIP, FirstStartIP, LastStartIP, EndIPOff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private RandomAccessFile fis;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private byte[] buff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private long B2L(byte[] b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long ret = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;b.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long t = 1L;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j=0; j&lt;i; j++) t = t * 256L;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret += ((b[i]&lt;0)?256+b[i]:b[i]) * t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ret;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private long ipToInt(String ip) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[] arr = ip.split("\\.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long ret = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;arr.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long l = 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j=0; j&lt;i; j++) l *= 256;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret += Long.parseLong(arr[arr.length-i-1]) * l;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret += 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ret;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void seek(String ip) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.IPN = ipToInt(ip);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis = new RandomAccessFile(this.DbPath, "r");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = new byte[4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.seek(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FirstStartIP = this.B2L(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LastStartIP = this.B2L(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RecordCount = (int)((LastStartIP - FirstStartIP) / 7);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (RecordCount &lt;= 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalStr = Country = "未知";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RangB = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RangE = RecordCount;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long RecNo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RecNo = (RangB+RangE)/2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getStartIP(RecNo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (IPN == StartIP) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RangB = RecNo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<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;if (IPN &gt; StartIP)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RangB = RecNo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RangE = RecNo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} while (RangB &lt; RangE-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getStartIP(RangB);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getEndIP();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCountry(IPN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String getFlagStr(long OffSet) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int flag = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.seek(OffSet);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = new byte[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag = (buff[0]&lt;0)?256+buff[0]:buff[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (flag==1 || flag==2 ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = new byte[3];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (flag == 2) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CountryFlag = 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndIPOff = OffSet-4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;OffSet = this.B2L(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} while (true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (OffSet &lt; 12) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.seek(OffSet);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return getStr();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String getStr() throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long l = fis.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream byteout = new ByteArrayOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte c&nbsp;&nbsp;= fis.readByte();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteout.write(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c = fis.readByte();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} while (c!=0 &amp;&amp; fis.getFilePointer() &lt; l);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return byteout.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private void getCountry(long ip) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (CountryFlag == 1 || CountryFlag == 2) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Country = getFlagStr(EndIPOff+4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (CountryFlag == 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalStr = getFlagStr(fis.getFilePointer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (IPN &gt;= ipToInt("255.255.255.0") &amp;&amp; IPN &lt;= ipToInt("255.255.255.255")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalStr = getFlagStr(EndIPOff + 21);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Country = getFlagStr(EndIPOff + 12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalStr = getFlagStr(EndIPOff+8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Country = getFlagStr(EndIPOff + 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalStr = getFlagStr(fis.getFilePointer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private long getEndIP() throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.seek(EndIPOff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = new byte[4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndIP = this.B2L(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = new byte[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CountryFlag = (buff[0]&lt;0)?256+buff[0]:buff[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return EndIP;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private long getStartIP(long RecNo) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OffSet = FirstStartIP + RecNo * 7;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.seek(OffSet);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = new byte[4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartIP = this.B2L(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = new byte[3];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.read(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndIPOff = this.B2L(buff);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return StartIP;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getLocal() { return this.LocalStr; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getCountry() { return this.Country; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setPath(String path) { this.DbPath = path; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QQWry w = new QQWry();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//w.setPath(new File("QQWry2.Dat").getAbsolutePath());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w.seek("59.39.253.251");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(w.getCountry() + " " + w.getLocal());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</div>
</div>
<br />
<br />
纯真IP库下载地址见: http://www.ialvin.cn/blog/article.asp?id=135<br />
IP库大小: 6M多<br />
<br />
如有问题,请到http://www.ialvin.cn/blog/article.asp?id=135提出
<img src ="http://www.blogjava.net/alvin/aggbug/141139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2007-08-23 14:58 <a href="http://www.blogjava.net/alvin/archive/2007/08/23/141139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用数据库JDBC连接写法</title><link>http://www.blogjava.net/alvin/archive/2007/07/18/131618.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Wed, 18 Jul 2007 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2007/07/18/131618.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/131618.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2007/07/18/131618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/131618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/131618.html</trackback:ping><description><![CDATA[5月15日<br>常用数据库JDBC连接写法<br>为了方便大家查找，整理内容如下：<br>1. MySQL(<a href="http://www.mysql.com/" target=_blank>http://www.mysql.com</a>)mm.mysql-2.0.2-bin.jar<br>Class.forName( "org.gjt.mm.mysql.Driver" );<br>cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd );<br><br>2. PostgreSQL(<a href="http://www.de.postgresql.org/" target=_blank>http://www.de.postgresql.org</a>)pgjdbc2.jar<br>Class.forName( "org.postgresql.Driver" );<br>cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd );<br><br>3. oracle(<a href="http://www.oracle.com/ip/deploy/database/oracle9i/" target=_blank>http://www.oracle.com/ip/deploy/database/oracle9i/</a>)classes12.zip<br>Class.forName( "oracle.jdbc.driver.OracleDriver" );<br>cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );<br><br>4. Sybase(<a href="http://jtds.sourceforge.net/" target=_blank>http://jtds.sourceforge.net</a>)jconn2.jar<br>Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );<br>cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd );<br>//(Default-Username/Password: "dba"/"sql")<br><br>5. Microsoft SQLServer(<a href="http://jtds.sourceforge.net/" target=_blank>http://jtds.sourceforge.net</a>)<br>Class.forName( "net.sourceforge.jtds.jdbc.Driver" );<br>cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd );<br><br>6. Microsoft SQLServer(<a href="http://www.microsoft.com/" target=_blank>http://www.microsoft.com</a>)<br>Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );<br>cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd );<br><br>7. ODBC<br>Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );<br>Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd );<br><br>8.DB2(新添加)<br>Class.forName("com.ibm.db2.jdbc.net.DB2Driver");<br>String url="jdbc:db2://192.9.200.108:6789/SAMPLE"<br>cn = DriverManager.getConnection( url, sUsr, sPwd );<br><br>9.Microsoft SQL Server series (6.5, 7.x and 2000) and Sybase 10<br><br>JDBC Name: jTDS<br>URL: <a href="http://jtds.sourceforge.net/" target=_blank>http://jtds.sourceforge.net/</a><br>Version: 0.5.1<br>Download URL: <a href="http://sourceforge.net/project/showfiles.php?group_id=33291" target=_blank>http://sourceforge.net/project/showfiles.php?group_id=33291</a><br><br>语法:<br>Class.forName("net.sourceforge.jtds.jdbc.Driver ");<br>Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://host:port/database","user","password");<br>or<br>Connection con = DriverManager.getConnection("jdbc:jtds:sybase://host:port/database","user","password");<br><br>10.Postgresql<br>JDBC Name: PostgreSQL JDBC<br>URL: <a href="http://jdbc.postgresql.org/" target=_blank>http://jdbc.postgresql.org/</a><br>Version: 7.3.3 build 110<br>Download URL: <a href="http://jdbc.postgresql.org/" target=_blank>http://jdbc.postgresql.org/</a>download.html<br>语法:<br>Class.forName("org.postgresql.Driver"); <br>Connection con=DriverManager.getConnection("jdbc:postgresql://host:port/database","user","password");<br><br>11.IBM AS400主机在用的JDBC语法<br>有装V4R4以上版本的Client Access Express<br>可以在C:\Program Files\IBM\Client Access\jt400\lib<br>找到 driver 档案 jt400.zip，并更改扩展名成为 jt400.jar<br>语法:<br>java.sql.DriverManager.registerDriver (new com.ibm.as400.access.AS400JDBCDriver ());<br>Class.forName("com.ibm.as400.access.AS400JDBCConnection");<br>con = DriverManager.getConnection("jdbc:as400://IP","user","password");<br><br>12.informix<br>Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br>String url = <br>"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <br>user=testuser;password=testpassword";<br>Lib：jdbcdrv.zip&lt;br&gt;&lt;br&gt;Class.forName( "com.sybase.jdbc.SybDriver" )<br>url="jdbc:sybase:Tds:127.0.0.1:2638/asademo";<br>SybConnection connection= (SybConnection)DriverManager.getConnection(url,"dba","sql");<br><br>13.SAP DB<br>Class.forName ("com.sap.dbtech.jdbc.DriverSapDB");<br>java.sql.Connection connection = java.sql.DriverManager.getConnection ( "jdbc:sapdb://" + host + "/" + database_name,user_name, password)<br><br>14.InterBase<br>String url = "jdbc:interbase://localhost/e:/testbed/database/employee.gdb";<br>Class.forName("interbase.interclient.Driver");<br>//Driver d = new interbase.interclient.Driver (); /* this will also work if you do not want the line above */<br>Connection conn = DriverManager.getConnection( url, "sysdba", "masterkey" );<br><br>15.HSqlDB<br>url:&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://hsqldb.sourceforge.net/" target=_blank>http://hsqldb.sourceforge.net/</a><br>driver:&nbsp;&nbsp;org.hsqldb.jdbcDriver<br>连接方式有4种，分别为：<br>con-str（内存）: jdbc:hsqldb.<br>con-str（本地）: jdbc:hsqldb:/path/to/the/db/dir<br>con-str（http）: jdbc:hsqldb:<a href="http://dbsrv/" target=_blank>http://dbsrv</a><br>con-str（hsql）: jdbc:hsqldb:hsql://dbsrv<br>文章来源:<a href="http://www.pkpk.org/blog/default.asp?id=56">http://www.pkpk.org/blog/default.asp?id=56</a> 
<img src ="http://www.blogjava.net/alvin/aggbug/131618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2007-07-18 23:56 <a href="http://www.blogjava.net/alvin/archive/2007/07/18/131618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个被老师批的半死的课程设计 图书管理系统</title><link>http://www.blogjava.net/alvin/archive/2007/07/06/128693.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Fri, 06 Jul 2007 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2007/07/06/128693.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/128693.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2007/07/06/128693.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/128693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/128693.html</trackback:ping><description><![CDATA[这一周,做课程设计,我分到的题目是 图书管理系统<br />
本来是用 VB 实现,周三时,差不多搞完,老师说用 VB 太简单<br />
改用了 Java 通宵在 JBuider 和 Eclipse 下干完这个,没想到收货时却被老师给批了个半死. 唉,郁闷!!!<br />
<img style="width: 415px; height: 448px" height="448" alt="" src="http://www.ialvin.cn/blog/attachments/month_0706/s2007629214036.JPG" width="415" border="0" /><br />
<img style="margin: 0px 2px -4px 0px" height="21" alt="下载文件" src="http://www.ialvin.cn/blog/images/download.gif" width="18" border="0" /> <a href="http://www.blogjava.net/Files/alvin/c2007629214256.rar" target="_blank">点击下载源文件</a>
<img src ="http://www.blogjava.net/alvin/aggbug/128693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2007-07-06 22:45 <a href="http://www.blogjava.net/alvin/archive/2007/07/06/128693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>俄罗斯方块</title><link>http://www.blogjava.net/alvin/archive/2007/04/15/110741.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Sun, 15 Apr 2007 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2007/04/15/110741.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/110741.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2007/04/15/110741.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/110741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/110741.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 昨天看同学在做俄罗斯方块,自己心痒痒的也想做个,费了九牛二虎之力,才写了这么个简单的 Applet 来,继续努力,争取尽快完善.&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2007/04/15/110741.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/110741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2007-04-15 09:45 <a href="http://www.blogjava.net/alvin/archive/2007/04/15/110741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库存储图片 [JAVA]</title><link>http://www.blogjava.net/alvin/archive/2007/03/30/107368.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Thu, 29 Mar 2007 16:30:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2007/03/30/107368.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/107368.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2007/03/30/107368.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/107368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/107368.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我们知道可以把二进制数据存进数据库里去,可是没做过哦!<br>前两天一网友问题怎么做?才去查一下资料,试验了一下&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2007/03/30/107368.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/107368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2007-03-30 00:30 <a href="http://www.blogjava.net/alvin/archive/2007/03/30/107368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 JNI 将浏览器嵌入 AWT 组件中</title><link>http://www.blogjava.net/alvin/archive/2007/03/06/102266.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Tue, 06 Mar 2007 13:45:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2007/03/06/102266.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/102266.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2007/03/06/102266.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/102266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/102266.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在 SunKing's Blog 看到过他写的一个程序，就是将 WebBrowser 嵌入 AWT 。看了之后很喜欢，可惜他不公开 C 代码。<br>为了跟他一样做出这样的效果，搜遍了网上的 VC++ 资料，自己做了这么个小东东出来了。感觉还不错，在自己的机上测试过。&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2007/03/06/102266.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/102266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2007-03-06 21:45 <a href="http://www.blogjava.net/alvin/archive/2007/03/06/102266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过 JNI 让 JAVA 与 Delphi 程序交互(五)</title><link>http://www.blogjava.net/alvin/archive/2006/12/13/87371.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Tue, 12 Dec 2006 18:20:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2006/12/13/87371.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/87371.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2006/12/13/87371.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/87371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/87371.html</trackback:ping><description><![CDATA[
		<p>通过 JNI 让 JAVA 与 Delphi 程序交互(五)</p>
		<p>之前,我们学了如何用 Java 调用 Delphi 程序的一个方法<br />如果在Delphi 程序在适当时候需要调用 Java 程序,又要怎么做呢?</p>
		<p>首先,我们先定义如下的 Java 类:</p>
		<p>//------------------------------------------------------------------------------<br />package alvinJNI;</p>
		<p>class HelloWorld {<br />        static {<br />                System.loadLibrary("DelphiAction");<br />        }<br />        String str = "你好";<br />        <br />        public native void callPrintText(HelloWorld hw);<br /> <br />        public void printText(String arg) {<br />                System.out.println(arg);<br />        }<br />        <br />        public static void main(String[] args) {<br />                HelloWorld hw = new HelloWorld();<br />                hw.callPrintText(hw);<br />        }</p>
		<p>}<br />//-------------------------------------------------------------------------------</p>
		<p>我们再像上次一样在 Delphi 中建立 DLL 工程,写下面的代码(有注释):</p>
		<p>//-------------------------------------------------------------------------------<br />library DelphiAction;</p>
		<p>uses<br />  JNI;</p>
		<p>//今天的这个程序稍微的复杂一点,因为要调用 Java 对象的方法,在这里可以学到对 JObject 的操作<br />procedure Java_alvinJNI_HelloWorld_callPrintText(PEnv: PJNIEnv; Obj: JObject; arg: JObject); stdcall;<br />var<br />  JVM: TJNIEnv;<br />  c: JClass;  //类ID<br />  fid: JFieldID;  //属性ID<br />  mid: JMethodID;  //方法ID<br />  tmpStr: JString;<br />  javaargs : array[0..0] of JValue; //调用方法时的参数<br />begin<br />  JVM := TJNIEnv.Create(PEnv);</p>
		<p>  {我们先来看下如何获得一个对象的某个属性值}<br />  {----------------------------------------}<br />  {我们对 Java 对象的操作要选获取这个对象的 ClassID,我们可以用下面的方法来取得.}<br />  c := JVM.GetObjectClass(arg);</p>
		<p>  {我们先来获取参数 HelloWorld arg 对象的 String str 这个属性的值<br />   这里我们先要获得这个属性在它所在类中的属性 ID }<br />  fid := JVM.GetFieldID(c, 'str', 'Ljava/lang/String;');<br />  {上面调用的这个方法中的参数分别是: 所属类ID, 属性名, 属性类型签名<br />   关于属性类型的签名,将在下面 '说明1' 给出}</p>
		<p>  {下面,我们就可以根据 属性ID 来获取属性值了, 这里我们会取得到 arg.str 这个字符串}<br />  tmpStr := JVM.GetObjectField(arg, fid);<br />  {上面的这个 JVM.GetObjectField(arg, fid) 用来获取属性值<br />   参数分别是: 要取得其属性的对象, 要取得的属性的属性ID<br />   这里取得的是一个 Java 的 String 对象,是 JString,其实它也就是 JObject 类型的}<br />  writeln('Delphi 输出的: ' + JVM.UnicodeJStringToString(tmpStr));</p>
		<p> </p>
		<p>
				<br />  {我们再来看下如何调用一个 JObject 的方法, 这里我们要调用的是 arg.printText() 这个方法}<br />  {------------------------------------------------------------------------------------}<br />  //我们还是要用到上面的那个 类ID: c.<br />  //这一次我们要取得这个方法的 方法ID<br />  mid := JVM.GetMethodID(c, 'printText', '(Ljava/lang/String;)V');<br />  //上面调用的这个方法中的参数分别是: 所属类ID, 方法名, 方法(参数+返回值)类型签名<br />  //关于方法(参数+返回值)类型的签名,将在下面 '说明2' 给出</p>
		<p>  //有了 方法ID 后我们就可以用这个ID来调用这个方法了,我们这里要调用的方法是: arg.printText(参数);<br />  //因为我们要调用的这个方法有参数, 调用 Java 方法的时候如果有参数,要建立参数数组,这里我们就来建立数组<br />  javaargs[0].l := tmpStr;<br />  {这里这个 javaargs 是 JValue 类型. 它有点特殊,它的用法在下面 说明3 给出}</p>
		<p>  {有了 类象, 方法ID, 参数. 下面我们就可以调用 arg.printText(javaargs) 这个方法了,使用下面这个方法就可实现}<br />  JVM.CallObjectMethodA(arg, mid, @javaargs);</p>
		<p>  JVM.Free;<br />end;</p>
		<p>exports<br />        Java_alvinJNI_HelloWorld_callPrintText;<br />end.</p>
		<p>//--------------------------------------------------------------------------------</p>
		<p>到这里,我们已经可以从 Delphi 中获得 Java 对象的属性了, 还可以调用一个 Java 对象的方法,是不是很酷呢?<br />你学到了没?</p>
		<p>
				<br />###########################说明1###############################<br />现在,我们还要再了解一个获取 "属性ID" 时的那个签名<br />上面例子中: fid := JVM.GetFieldID(c, 'str', 'Ljava/lang/String;'); 用的签名是: 'Ljava/lang/String;'<br />因为刚刚要获得的属性是 java.lang.String 类型的,所以它的签名是: 'Ljava/lang/String;'<br />如果,我们要获得的属性是其它类型,获取 属性ID 时又要怎样签名呢?下面给出一个对照表</p>
		<p>byte -- B<br />char --- C<br />double -- D<br />float -- F<br />int -- I<br />long -- J (注意：是J不是L)<br />short -- S<br />void -- V<br />boolean - Z（注意：是Z不是B）<br />class(类对象类型) - 'L'+完整类名+';'  (包路径分隔符为: '/'.   如上面例子中的 String 对型, 签名为: 'Ljava/lang/String;')</p>
		<p>数组 type[] -- '['+type (例如 float[] 的签名就是 '[float')<br />(如果是二维数组，如float[][]，则签名为 '[[float')</p>
		<p>
				<br />############################说明2###############################<br />现在,我们还要再了解一个获取 "方法ID" 时的那个签名<br />上面例子中: mid := JVM.GetMethodID(c, 'printText', '(Ljava/lang/String;)V'); 用的签名是: '(Ljava/lang/String;)V'<br />方法ID 的签名,分为两部分<br />一部分是前面括号中的,是参数类型的签名<br />另一部分是括号后的,是返回值类型的签名<br />其中某个签数与返回值的类型签名与获取属性ID时的签名是一样的<br />上面要调用的方法只有一个参数,如果有多个参数时又怎样呢?</p>
		<p>如: int getInt(long a, double b); 这样的 Java 方法要这样签名: '(JD)I'<br />(注意:参数签名是连续的,没有分隔符, 这里第一个参数 long 签名为:J, 第二个参数签名为: D, 返回值类型 int 签名为: I)<br />说到这里,相信大家都会使用这个签名了</p>
		<p>
				<br />############################说明3###############################<br />在调用一个 Java 方法时, 如果这个方法有参数, 我们就要传递一个参数数组的地址给 Java<br />现在,我们还要再了解如何创建这样的一个参数数组<br />传递给 Java 方法的参数,类型均为 JValue. 它是一个packed record</p>
		<p>
				<br />如果,我们要调用的方法 void myMethod(int a, long b, String c); 有 3 个参数<br />那么<br />1.我们先要声明如下数组:<br />var<br />  args : array[0..1] of JValue;<br />2.给数组赋值<br />  args[0].i := 100;<br />  args[1].j := 100;<br />  args[2].l := JVM.StringToJString(pchar(UTF8Encode('雅林网络 <a href="http://zmzx.icpcn.com'">http://zmzx.icpcn.com'</a>)));<br />3.调用<br />  JVM.CallVoidMethodA(Java对象, 方法ID, @args);</p>
		<p>JValue 是一个 packed record,它的定义如下:<br />  JValue = packed record<br />  case Integer of<br />    0: (z: JBoolean);<br />    1: (b: JByte   );<br />    2: (c: JChar   );<br />    3: (s: JShort  );<br />    4: (i: JInt    );<br />    5: (j: JLong   );<br />    6: (f: JFloat  );<br />    7: (d: JDouble );<br />    8: (l: JObject );<br />  end;</p>
		<p>调用方法时,TJNIEnv 还有:<br />    CallObjectMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallBooleanMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallByteMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallCharMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallShortMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallIntMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallLongMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallFloatMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallDoubleMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallVoidMethodA: procedure(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualObjectMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualBooleanMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualByteMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualCharMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualShortMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualIntMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualLongMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualFloatMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualDoubleMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}<br />    CallNonvirtualVoidMethodA: procedure(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}</p>
		<p>
				<br />好了,到这里,相信大家对做 Delphi 的 JNI 已有一定的了解<br />关于 Delphi JNI 的话题就先说到这里<br />如果有兴趣,大家可以打开 jni.pas 了解更多<br /></p>
<img src ="http://www.blogjava.net/alvin/aggbug/87371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2006-12-13 02:20 <a href="http://www.blogjava.net/alvin/archive/2006/12/13/87371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过 JNI 让 JAVA 与 Delphi 程序交互(四)</title><link>http://www.blogjava.net/alvin/archive/2006/12/11/87084.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Mon, 11 Dec 2006 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2006/12/11/87084.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/87084.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2006/12/11/87084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/87084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/87084.html</trackback:ping><description><![CDATA[
		<p>通过 JNI 让 JAVA 与 Delphi 程序交互(四)</p>
		<p>在上一篇中,我们说了如何用 Java 调用 Delphi 程序的一个方法并传递给其一个参数<br />现在我们再来看一下如果如果要调用的方法有返回值,又要怎么做.</p>
		<p>
				<br />首先,我们先定义如下的 Java 类:</p>
		<p>//------------------------------------------------------------------------------<br />package alvinJNI;</p>
		<p>class HelloWorld {<br />        static {<br />                System.loadLibrary("DelphiAction");<br />        }</p>
		<p>        public native String printText(String arg);</p>
		<p>        public static void main(String[] args) {<br />                HelloWorld hw = new HelloWorld();<br />                System.out.println(hw.printText("你好"));<br />        }</p>
		<p>}<br />//-------------------------------------------------------------------------------</p>
		<p>我们再像上次一样在 Delphi 中建立 DLL 工程,写下面的代码(有注释):</p>
		<p>//-------------------------------------------------------------------------------<br />library DelphiAction;</p>
		<p>uses<br />  JNI;</p>
		<p>//今天,因为这个方法有返回值,所以不再是 procedure 过程,我们要变成 function 函数, 返回值类型为 JString<br />function Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject; arg: JString): JString; stdcall;<br />var<br />  tmpStr: String;<br />  JVM: TJNIEnv;<br />  tt: Boolean;<br />begin<br />  JVM:= TJNIEnv.Create(PEnv);</p>
		<p>  //我们这里先把参数提交过来的 JString 转换成 Delphi 中的 String 后就可以使用了<br />  tmpStr := '你想输出的字符串是: "' + JVM.UnicodeJStringToString(arg) + '"。';</p>
		<p>  //当字符串要转换成 JString 我们需要先对字符串进行 UTF8 编码后再转换成 PChar 再转换成 JString<br />  //这样才能保证返回的字符串在 JAVA 中不乱码<br />  Result := JVM.StringToJString(pchar(UTF8Encode(tmpStr)));<br />  JVM.Free;<br />end;</p>
		<p>exports<br />        Java_alvinJNI_HelloWorld_printText;<br />end.<br />//--------------------------------------------------------------------------------</p>
		<p>再看看效果吧,是不是成功了?</p>
		<p>这里如果返回值的类型是其它的其本类型,比如 JLong,JInt,JFloat,JDouble,JBoolean,JShort,JByte<br />这些类型的数据可以直接与 Delphi 中的数据运算,对应 Int64,Integer,Single,Double,Boolean,SmallInt,ShortInt<br />返回时可以直接给 Result 赋 Delphi 中的数值. 如:<br />function Java_alvinJNI_HelloWorld_getInt(PEnv: PJNIEnv; Obj: JObject): JInt; stdcall;<br />var<br />  tmp: Integer;<br />begin<br />  tmp := 10;<br />  Result := tmp;<br />end;</p>
		<p>如果返回值的类型是 Object 的 Java 对象,返回 JObject 类型,它的用法我们在以后再来学习.<br />如果返回值的类型是 Type[] 数组,接收参数时要设为 JObject 类型,怎样创建这样的数组对象,我自己也还不知道,以后知道了我再来贴上<br />因为 Java 是把数组作为对象看待的.它要以以下的方式来使用:</p>
		<p>例如: 我们要给 Delphi 的方法传入一个 byte[] 型数组,在定义 Delphi 方法时参数声明为 bytearray: JObject </p>
		<p>在方法中:<br />var<br /> PByteArr: PJByte   //PJByte 是 JNI.pas 定义的, 里面还有 PJBoolean, PJObject, PJInt 等..<br /> JVM: TJNIEnv;<br /> isCopy: Boolean;<br />begin<br /> JVM:= TJNIEnv.Create(PEnv);<br /> isCopy := false;<br /> PByteArr := JVM.GetByteArrayElements(bytearray, isCopy);  //调用这个方法,可以将取得参数 bytearray 的地址, isCopy 决定是否复制数组<br /> //之后,我们可以通过 PByteArr 结合 inc(PByteArr) 这个指针来操作传过来的数组.<br />end; </p>
		<p>
				<br />好了,就先说到这里,今天,你是不是又学到了什么?</p>
<img src ="http://www.blogjava.net/alvin/aggbug/87084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2006-12-11 23:13 <a href="http://www.blogjava.net/alvin/archive/2006/12/11/87084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过 JNI 让 JAVA 与 Delphi 程序交互(三)</title><link>http://www.blogjava.net/alvin/archive/2006/12/02/84962.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Fri, 01 Dec 2006 19:12:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2006/12/02/84962.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/84962.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2006/12/02/84962.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/84962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/84962.html</trackback:ping><description><![CDATA[
		<p> </p>
		<p>在上一篇中,我们说了如何用 Java 调用 Delphi 程序的一个方法并传递给其一个字符串参数,现在我们再来看一下如果传递的参数是其它基本类型,又要怎么做.</p>
		<p>
				<br />首先,我们先看一下如何传递 int 型参数,定义如下的 Java 类:</p>
		<p>//----------------------------------------------------------------------------------------------------------<br />package alvinJNI;</p>
		<p>class HelloWorld {<br />        static {<br />                System.loadLibrary("DelphiAction");<br />        }</p>
		<p>        public native void printText(int i);</p>
		<p>        public static void main(String[] args) {<br />                HelloWorld hw = new HelloWorld();<br />                hw.printText(100);<br />        }</p>
		<p>}<br />//----------------------------------------------------------------------------------------------------------</p>
		<p>我们再像上次一样在 Delphi 中建立 DLL 工程,写下面的代码(有注释):</p>
		<p>//----------------------------------------------------------------------------------------------------------<br />library DelphiAction;</p>
		<p>uses<br />  JNI;</p>
		<p>//我们给这个方法加的参数是: i: JInt<br />procedure Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject; i: JInt); stdcall;<br />var<br />  tmpInt: Integer;</p>
		<p>begin<br />  //参数提交过来的 int 型数据,在这里是一个 JInt 数据,它其实就是一个 Integer 数据,它的使用更加方便<br />  //它可以直接地参与 Interger 类型数据的运算,是不是很容易.<br />  tmpInt := i + 100;<br />  tmpInt := tmpInt - 100;<br />  Writeln(tmpInt);<br />end;</p>
		<p>exports<br />        Java_alvinJNI_HelloWorld_printText;<br />end.<br />//----------------------------------------------------------------------------------------------------------</p>
		<p>再看看效果吧,是不是成功了?</p>
		<p>这里如果是 long 型参数,接收时要设为 JLong 类型,它也可以跟对应的整型数运算,我们常用它跟 Int64 一起运算<br />如果参数类型是 float ,接收参数时要设为 JFloat 类型,它也可以跟跟 Single 一起运算<br />如果参数类型是 double ,接收参数时要设为 JDouble 类型,它也可以跟跟 Delphi 中的 Double 型数据一起运算<br />如果参数类型是 boolean ,接收参数时要设为 JBoolean 类型,它也可以跟跟 Delphi 中的布尔型数据一起运算<br />如果参数类型是 short ,接收参数时要设为 JShort 类型,它也可以跟跟 SmallInt 型数据一起运算<br />如果参数类型是 byte ,接收参数时要设为 JByte 类型,它也可以跟跟 ShortInt 型数据一起运算<br />如果参数类型是 Object 的 Java 对象,接收时要设为 JObject 类型,它的用法比较复杂(涉及到对 Java 类和对象的操作),我们在以后再来学习.<br />如果参数类型是 Type[] 数组,接收参数时要设为 JObject 类型,因为 Java 是把数组作为对象看待的.它要以以下的方式来使用:</p>
		<p>例如: 我们要给 Delphi 的方法传入一个 byte[] 型数组,在定义 Delphi 方法时参数声明为 bytearray: JObject </p>
		<p>在方法中:<br />var<br /> PByteArr: PJByte   //PJByte 是 JNI.pas 定义的, 里面还有 PJBoolean, PJObject, PJInt 等..<br /> JVM: TJNIEnv;<br /> isCopy: Boolean;<br />begin<br /> JVM:= TJNIEnv.Create(PEnv);<br /> isCopy := false;<br /> PByteArr := JVM.GetByteArrayElements(bytearray, isCopy);  //调用这个方法,可以将取得参数 bytearray 的地址, isCopy 决定是否复制数组<br /> //之后,我们可以通过 PByteArr 结合 inc(PByteArr) 这个指针来操作传过来的数组.<br />end; </p>
		<p>
				<br />好了,就先说到这里,今天,你是不是又学到了什么?</p>
<img src ="http://www.blogjava.net/alvin/aggbug/84962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2006-12-02 03:12 <a href="http://www.blogjava.net/alvin/archive/2006/12/02/84962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过 JNI 让 JAVA 与 Delphi 程序交互(二)</title><link>http://www.blogjava.net/alvin/archive/2006/12/01/84947.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Fri, 01 Dec 2006 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2006/12/01/84947.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/84947.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2006/12/01/84947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/84947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/84947.html</trackback:ping><description><![CDATA[
		<p>现在难得来看一下自己的博客,今天好不容易找了个代理,顺便再继续之前的话题,就是 JAVA 与 Delphi 的交互了.</p>
		<p>在上一篇中,我们说了如何用 Java 调用 Delphi 程序的一个方法,今天我们再深入一点,就是怎样提交参数个 Delphi 的方法,以动态的控制 Delphi 的方法.<br />下面,我们切入正题.</p>
		<p>首先,我们定义如下的 Java 类:</p>
		<p>//----------------------------------------------------------------------------------------------------------<br />package alvinJNI;</p>
		<p>class HelloWorld {<br />        static {<br />                System.loadLibrary("DelphiAction");<br />        }</p>
		<p>        public native void printText(String str);</p>
		<p>        public static void main(String[] args) {<br />                HelloWorld hw = new HelloWorld();<br />                hw.printText("您好！看到效果了吧。");<br />        }</p>
		<p>}<br />//----------------------------------------------------------------------------------------------------------</p>
		<p>我们再像上次一样在 Delphi 中建立 DLL 工程,写下面的代码(有注释):</p>
		<p>//----------------------------------------------------------------------------------------------------------<br />library DelphiAction;</p>
		<p>uses<br />  JNI;</p>
		<p>//这一次我们要写的这个方法因为要接收一个 Java 传过来的参数,所以我们来说一下这个参数列表的问题<br />//参数列表中的第一个参数 PEnv 类型为 PJNIEnv, 它是 JNI.pas中定义的类型,我们好多工作要通过它来实现,可以把它看成是一个帮你的程序与 Java 沟通的桥梁.<br />//参数列表中的第一个参数 obj 类型为 JObject.前面这两个参数是固定的,这第二个参数暂时我们还不会用到.<br />//今天,我们还要给这个方法多加一个参数,用来接受 Java 传过来的参数. str: JString</p>
		<p>procedure Java_alvinJNI_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject; str: JString); stdcall;<br />//这回我们需要用到一个 TJNIEnv 对象,我们来声明<br />var<br />  JVM: TJNIEnv;<br />  tmpStr: String;</p>
		<p>begin<br />  //实例化 JVM, 这个对象可以看成是 Java 的虚拟机.(自己的理解)<br />  JVM := TJNIEnv.Create(PEnv);</p>
		<p>  //参数提交过来的字符串,实际上是一个 JString 对象,我们在这里要用 JVM 来转化它.<br />  //我们调用 JVM 的 UnicodeJStringToString 函数就可以实现 JString 到 String 的转化了.<br />  tmpStr := JVM.UnicodeJStringToString(str);</p>
		<p>  Writeln(tmpStr);</p>
		<p>  //我们使用完 JVM 后,要将其释放.<br />  JVM.Free;<br />end;</p>
		<p>exports<br />        Java_alvinJNI_HelloWorld_printText; //为函数做引出声明,这样才能真正的被调用到<br />end.<br />//----------------------------------------------------------------------------------------------------------</p>
		<p>我们现在就可以生成 DelphiAction.dll 将其放在 Java 工程目录下, 再执行 alvinJNI.HelloWorld 看看效果了.</p>
		<p>好了,我们今天主要就是实现了一下,如何在 Java 调用 Delphi 的方法时,给其提交一个参数.<br />是不是很爽?</p>
		<p>今天就先说到这里.接下来,我会尽快的再贴上一些文章</p>
<img src ="http://www.blogjava.net/alvin/aggbug/84947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2006-12-01 21:30 <a href="http://www.blogjava.net/alvin/archive/2006/12/01/84947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过 JNI 让 JAVA 与 Delphi 程序交互</title><link>http://www.blogjava.net/alvin/archive/2006/11/14/81035.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Mon, 13 Nov 2006 21:10:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2006/11/14/81035.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/81035.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2006/11/14/81035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/81035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/81035.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有些时候,要写一些程序,在 JAVA 里面好难实现, 但如果使用其它编程语言却又比较容易时,我们不妨通过 JNI 来让不同语言的程序共同完成.<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2006/11/14/81035.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/81035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2006-11-14 05:10 <a href="http://www.blogjava.net/alvin/archive/2006/11/14/81035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决 JAVA 写入文本文件时中文乱码</title><link>http://www.blogjava.net/alvin/archive/2006/11/05/79235.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Sun, 05 Nov 2006 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2006/11/05/79235.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/79235.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2006/11/05/79235.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/79235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/79235.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 之前写过一个方法可以解决从外部读入文本时中文不会乱码，可是从程序中的字符串要写回文本文件时又出现了中文字符乱码，原因是JAVA默认使用Unicode编码的字符，而我们使用的windows系统文本文件使用的是GBK编码，要解决这个问题，就得从编码上入手。下面这个方法就可以将字符串以GBK编码写入文本文件，这样就可以解决写入中文字符乱码的问题了。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2006/11/05/79235.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/79235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2006-11-05 18:22 <a href="http://www.blogjava.net/alvin/archive/2006/11/05/79235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决 JAVA 读取文本中文乱码</title><link>http://www.blogjava.net/alvin/archive/2006/11/04/79087.html</link><dc:creator>林志斌</dc:creator><author>林志斌</author><pubDate>Sat, 04 Nov 2006 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/alvin/archive/2006/11/04/79087.html</guid><wfw:comment>http://www.blogjava.net/alvin/comments/79087.html</wfw:comment><comments>http://www.blogjava.net/alvin/archive/2006/11/04/79087.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/alvin/comments/commentRss/79087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alvin/services/trackbacks/79087.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当使用文件流读取文本文件时,如果遇到中文字符,将会读到乱码.<br>偶然的一次在一本参考书看到 用byte数组存储读取结果,再用byte数组构建字符串,可解决乱码问题,试了一下,果然见效了,于是写了下面一个简单的类,以备用.&nbsp;&nbsp;<a href='http://www.blogjava.net/alvin/archive/2006/11/04/79087.html'>阅读全文</a><img src ="http://www.blogjava.net/alvin/aggbug/79087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alvin/" target="_blank">林志斌</a> 2006-11-04 17:24 <a href="http://www.blogjava.net/alvin/archive/2006/11/04/79087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>