﻿<?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-程序人生</title><link>http://www.blogjava.net/zuroc/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:01:15 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:01:15 GMT</pubDate><ttl>60</ttl><item><title>Magic Linux</title><link>http://www.blogjava.net/zuroc/archive/2005/04/09/3037.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Sat, 09 Apr 2005 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/04/09/3037.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/3037.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/04/09/3037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/3037.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/3037.html</trackback:ping><description><![CDATA[Magic Linux是由中国软件志愿者共同开发的操作系统。开发的初衷是为了加强Linux操作系统的中文支持程度，降低中国用户的学习门槛，达到在中国普及和推广Linux的目的。<BR><A href="http://www.magiclinux.org/drupal/?q=node/27">Magic Linux团队</A>
<H1 class=title>团队组成结构</H1><!-- begin content -->
<DIV class="node "><SPAN class=submitted>Submitted by <A title="View user profile." href="http://www.magiclinux.org/drupal/?q=user/2">jackey</A> on Thu, 11/20/2003 - 15:20.</SPAN> 
<DIV class=content>
<DIV class=wikitext><B>Magic Linux 团队由三个部门组成：系统开发部，网站开发部，管理协调部。</B><BR><BR>
<HR>

<DIV class=simplebox>
<DIV align=center>
<H1>系统开发部</H1></DIV></DIV>系统开发部负责Magic Linux的开发和维护。现在由6个小组组成，分别如下：<BR><BR>1、系统文档组：用户手册的撰写和更新。 
<P></P>
<P><BR>2、系统支持组：文档翻译、问题解答、FAQ整理、用户手册编写、以用户代表身份编写ML应用解决方案等。<BR><BR>3、系统测试组：硬件测试、软件测试；兼容性测试、稳定性测试、性能测试、以各类用户代表身份进行评价。<BR><BR>4、系统计划组：需求调研、需求征集、反馈意见整理、需求管理和版本计划、其他发行版观察员、以各类用户代表身份提出需求。<BR><BR>5、系统开发组：安装程序开发、配置程序开发、自主应用开发、错误修正和软件包维护、其他发行版移植、升级补丁包开发、版本控制。<BR><BR>6、系统资源组：软件搜集、软件汉化、桌面背景制作、窗口装饰制作、桌面图标制作、其他发行版观察员/移植员。<BR><BR><BR><BR>
<DIV class=simplebox>
<DIV align=center>
<H1>网站开发部</H1></DIV></DIV>网站开发部负责Magic Linux官方网站的开发和日常维护工作。现在由2个小组组成，分别如下：<BR><BR>1、网站维护组：网站的日常维护和更新。<BR><BR>2、网站开发组：网站修复和开发。<BR><BR><BR><BR>
<DIV class=simplebox>
<DIV align=center>
<H1>管理协调部</H1></DIV></DIV>管理协调部主要协助不同部门和组之间的管理和协调工作。<BR></DIV></DIV></DIV><img src ="http://www.blogjava.net/zuroc/aggbug/3037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-04-09 15:22 <a href="http://www.blogjava.net/zuroc/archive/2005/04/09/3037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>例解 VC++ 6.0 实现 JNI</title><link>http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Thu, 07 Apr 2005 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2908.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2908.html</trackback:ping><description><![CDATA[<!-- BEGIN MASTHEAD --><!-- BEGIN VNV1 MASTHEAD COMPONENT, thinner variation for content pages -->&nbsp;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD>
<TABLE border=0 cellPadding=0 cellSpacing=0 class=topnav height=25 width="100%">
<FORM action=http://developer.sun.com/dispatcher.jsp method=post name=formsearch>
<TBODY>
<TR>
<TD><IMG alt="" border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD>
<TD><A href="http://gceclub.sun.com.cn/">gceclub.sun.com.cn</A></TD>
<TD width="100%">&nbsp;</TD>
<TD noWrap><B>Search:</B>&nbsp;</TD>
<TD></TD>
<TD>&nbsp;</TD>
<TD class=selectcell><SELECT class=globalsearch name=uid> <OPTION selected value=6910018>英文开发者网站</OPTION></SELECT></TD>
<TD>&nbsp;</TD>
<TD align=left vAlign=center><INPUT border=0 class=buttonred onmouseout="this.style.color='#FFF';" onmouseover="this.style.color='#fbe249';" type=submit value=&nbsp;»&nbsp;></TD>
<TD><IMG alt=" " height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD></TR></FORM></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD><IMG alt=" " border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD>
<TD class=grey3 vAlign=top></TD>
<TD><IMG alt=" " border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD>
<TD class=sunblue noWrap vAlign=top>
<DIV class=pad3>&nbsp;</DIV></TD>
<TD align=right class=sunblue vAlign=top width="100%">
<DIV class=pad10>&nbsp;</DIV></TD>
<TD><IMG alt=" " border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><SPAN class=sp5>&nbsp;</SPAN><BR><!-- END VNV1 MASTHEAD COMPONENT, thinner variation for content pages --><!-- END MASTHEAD --><!-- BEGIN BREADCRUMB -->
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD height=24>
<DIV class=breadcrumb><A href="http://gceclub.sun.com.cn/">首页</A> &gt; <A href="http://gceclub.sun.com.cn/yuanchuang/index.html">网友原创文章</A> </DIV></TD></TR></TBODY></TABLE><!-- END BREADCRUMB --><!-- 正文开始 -->
<TABLE align=center border=0 cellPadding=0 cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>
<P>作者：<A href="http://gceclub.sun.com.cn/yuanchuang/week-15/jni.html#about">陈健明</A></P><A name=about></A>
<H4>作者简介</H4><BR>
<P>陈健明，华中师范大学网络与通讯研究所，您可以通过<A href="mailto:chenjm2000@hotmail.com">chenjm2000@hotmail.com</A>和作者取得联系。</P>
<H4>内容摘要</H4><BR>
<P>JNI是JDK的一部分，用于为Java提供一个本地代码的接口。通过使用JNI编写的程序能够确保你的代码能够完全的移植到所有的平台。JNI使得运行在JVM虚拟机上的Java代码能够操作使用其它语言编写的应用程序和库，比如C/C++以及汇编语言等。此外JNI提供的某些API还允许你把JVM嵌入到本地应用程序中。下图表达了JNI所扮演的角色。</P>
<P><IMG alt="" border=0 height=178 src="http://gceclub.sun.com.cn/yuanchuang/week-15/jni-01.jpg" width=269></P>
<P>本文将通过一个实例来阐述使用VC++6.0来实现JNI的完整过程。使用JNI来整合本地代码和Java代码的步骤是确定的，没有再创作的余地，所以读者可以通过本文的步骤来逐步认识到，其实Java也是"没有什么不可以"的。</P>
<H4>一、JNI的实现</H4><BR>
<P>任务描述：在Java中调用windows下的消息框函数，并且从Java中传递一个字符串作为MessageBox函数的显示文本参数，显示在消息框的中间。下面让我们一起进入这一奇妙的旅程。</P>
<P><B>Step 1</B>：写一个Java类，在这个类中包含了需要调用的本地方法的描述。</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>//WinMsgBox.java
package edu.netcom.jni;
public class WinMsgBox  
{
	static{
		System.loadLibrary("WinMsgDll");    // (1)
	}
	public native void showMsgBox(String str);  // (2)
}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>(1)中WinMsgDll是动态链接文件的文件名，不用加扩展名，因为在不同的平台下动态链接文件扩展名是不同的，由JVM自动识别，比如在Solaris下，会被转换为WinMsgDll.so；而Win32环境下会转换为WinMsgDll.dll。这个文件名必须和Step 4中生成的文件名一致。这个文件的存放位置也很重要，它只能被放在JVM属性值java.library.path中指定的文件夹中。这个属性值可以使用System.getProperty("java.library.path");来查看。一般情况下，至少放在这几个位置是确定可靠的，windows安装目录下的system32下面，JDK安装目录下的bin下面，以及调用主类文件的当前目录。</P>
<P>(2)中指明了你必须用本地代码实现的方法。</P>
<P><B>Step 2</B>：提示符下使用命令javac -d . WinMsgBox.java编译Step 1编写的java文件。</P>
<P>此时会在当前目录下建立一个edu\netcom\jni目录结构，并且一个WinMsgBox.class文件存在其中。</P>
<P><B>Step 3</B>：提示符下使用命令javah -jni edu.netcom.jni.WinMsgBox，此时会在当前目录下产生一个edu_netcom_jni_WinMsgBox.h文件，注意这个文件名是由（包名+类名）组成，中间用（_）隔开。此文件内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>/* DO NOT EDIT THIS FILE - it is machine generated */
#include &lt;jni.h&gt;                       // (1)
/* Header for class edu_netcom_jni_WinMsgBox */

#ifndef _Included_edu_netcom_jni_WinMsgBox
#define _Included_edu_netcom_jni_WinMsgBox
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     edu_netcom_jni_WinMsgBox
 * Method:    showMsgBox
 * Signature: (Ljava/lang/String;)V       // (2)
 */
JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox
  (JNIEnv *, jobject, jstring);           // (3)

#ifdef __cplusplus
}
#endif
#endif
</PRE></TD></TR></TBODY></TABLE><BR>
<P>(1)包含的jni.h存在于JDK安装目录下的include下面。</P>
<P>(2)(Ljava/lang/String;)V这是函数的标记符，当从本地方法端访问Java端的方法时，会用到这个标记符。JNI中为每种数据类型也定义了标记符，标记符的规则请查看JNI标准文档。</P>
<P>(3)在WinMsgBox.java中本地方法void showMsgBox(String str);的定义，被映射为JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox(JNIEnv *, jobject, jstring); 其中函数名的映射规则是（Java_包名_类名_方法名），如果存在重载的方法，则在后面还会增加每个参数的标记符。每一个方法映射到本地C函数后都会增加两个参数：JNIEnv *和jobject，关于这两个参数的用法将在后面阐述。另外，所有Java中的数据类型都会按一定规则进行映射为本地数据类型，这些数据类型都是在jni.h中定义的。下面分别按照基本数据类型，和对象类型列出。</P>
<P>表1 Java基本类型到本地类型的映射</P>
<P><IMG alt="" border=0 height=236 src="http://gceclub.sun.com.cn/yuanchuang/week-15/jni-02.jpg" width=590></P>
<P>表2 Java中的类到本地类型的映射</P>
<P><IMG alt="" border=0 height=323 src="http://gceclub.sun.com.cn/yuanchuang/week-15/jni-03.jpg" width=623></P>
<P><B>Step 4</B>：使用VC来编写本地方法的实现函数，最后编译成.dll文件。过程如下：</P>
<P>1) 选择new-&gt;projects(选择Win32 Dynamic-Link Library，以Step 1中指定的库名WinMsgDll作为工程名)-&gt;OK-&gt;An ampty DLL project-&gt;Finish。</P>
<P>2) 选择Tools-&gt;Options-&gt;Directories(添加目录D:\J2SDK1.4.2_03\INCLUDE和D:\J2SDK1.4.2_03\INCLUDE\WIN32)。在这些目录中包含JNI所需的头文件。</P>
<P>3) 将Step 3生成的edu_netcom_jni_WinMsgBox.h拷贝到WinMsgDll工程文件夹中。然后FileView中添加这个头文件。</P>
<P>4) 添加源文件WinMsgDll.cpp，内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>#include "windows.h"
#include "edu_netcom_jni_WinMsgBox.h"
/*
 * Class:     edu_netcom_jni_WinMsgBox
 * Method:    showMsgBox
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox
(JNIEnv * env, jobject obj, jstring str){
	const char *msg;
	msg = env-&gt;GetStringUTFChars(str,0);
	MessageBox(NULL,msg,"Java invoke",MB_OK);
	env-&gt;ReleaseStringUTFChars(str,msg);
}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>5) 编译生成WinMsgBox.dll文件。并将这个.dll文件拷贝到Step 1中说明的目录中。</P>
<P><B>注意：</B></P>
<P>1) 我们知道dll文件有两种指明导出函数的方法，一种是在.def文件中定义，另一种是在定义函数时使用关键字__declspec(dllexport)。而在JNI中函数定义中的关键字JNIEXPORT实际在jni_md.h中如下定义，#define JNIEXPORT __declspec(dllexport)，可见JNI默认的导出函数使用第二种。使用第二种方式产生的导出函数名会根据编译器发生变化，在有的情况下会发生找不到导出函数的问题（我们在JSP中使用JNI时就发生了这种问题，百思不得其解，后来强行加入一个.def文件就解决了）。因此最好是使用第一种方法自己定义一个.def文件来指明导出函数，这种情况下会强制使用第一种方式产生导出函数。本例中可以加入一个WinMsgDll.def文件，内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>LIBRARY      "WinMsgDll"
DESCRIPTION  'message Windows Dynamic Link Library'
EXPORTS
    ; Explicit exports can go here
	Java_edu_netcom_jni_WinMsgBox_showMsgBox
</PRE></TD></TR></TBODY></TABLE><BR>
<P>2) 从本例中，我们可以看到WinMsgBox.java决定了edu_netcom_jni_WinMsgBox.h，而后者又决定了WinMsgDll.dll，也就是说，这是一个"牵一发而动全身"的过程，如果你改动了WinMsgBox.java，就一定要把整个步骤都走一遍（这一点一定要切记，因为这也是我们跌得鼻青脸肿后才得出的警世良言）。</P>
<P>3) 生成的.dll文件一定要正确拷贝到Step 1说明的目录中，本例中是将生成的WinMsgDll.dll和Step 5中的测试文件放在同一个目录下的（这也是我们困惑了很久才解决的问题）。</P>
<P><B>Step 5</B>：编写一个测试文件来测试对WinMsgDll.dll的调用。测试文件TestJNI.java内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>//TestJNI.java
import edu.netcom.jni.WinMsgBox;
public class TestJNI 
{
	public static void main(String[] args) 
	{
		     WinMsgBox box = new WinMsgBox();
		box.showMsgBox("Wonderful!!");
	}
}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>编译，运行，windows下的对话框跃然屏幕中间。到此为此，整个JNI的实现过程就已经完成了。</P>
<H4>二、补充说明</H4><BR>
<P>JNI为程序员提供了一种方法，使得他们能够充分利用JVM以外的，完全由平台决定的功能。但是你不应该滥用JNI。大多数情况可能是因为这样而必须使用JNI，如你已经有做好了的本地.dll文件，其中已经包含了大量呕心沥血的函数，而你不愿意，也不可能完全用Java重写它们，那么此时你应该用JNI。但是你必须按前面的步骤来进行，只是在Step 4中编写的.dll要调用已有的本地.dll，也就是说用Step 4中的.dll"封装"已有的.dll。</P>
<P>在Java中定义的本地方法映射到本地C函数后都会增加两个参数：JNIEnv *和jobject。第一个参数JNIEnv是一个指针，指向在jni.h中定义的一个数据结构，结构中包含了一系列的函数的指针，我们把它们称之为JNI函数。使用这些JNI函数可以使程序员从本地函数这一侧完成对Java的操作，如访问Java字符串、数组、调用Java的方法、成员变量、甚至处理Java端的异常等。第二个参数会根据Java类中本地方法的定义不同而不同，如果是定义为static方法，类型会是jclass，表示对特定Class对象的引用，如果是非static方法，类型是jobject，表示当前对象的引用（本例中就是对WinMsgBox对象的引用），相当于this。</P>
<P>C函数通过JNI接受来自Java的传参也是按基本类型直接传值，对象传引用。对于基本类型可以按照表1来使用，其它类型都必须使用JNI函数进行转换后才能在C函数中使用。如本例中从Java中传递了一个字符串，映射为JNI类型jstring。使用JNI函数GetStringUTFChars将jstring转换为UTF-8字符串，然后便可以使用C语言中的任何字符串操作函数进行操作。由于JVM在调用本地方法时，是在虚拟机中开辟了一块本地方法栈供本地方法使用，当本地方法使用完UTF-8串后，必须使用ReleaseStringUTFChars，通过它来通知虚拟机去回收UTF-8串占用的内存，否则将会造成内存泄漏，最终导致系统崩溃。同样的，如果需要将C函数返回的返回值能够正确通过JNI传给Java，也要使用JNI函数转换为前面两个表中的类型。</P>
<P>关于 JNI 函数的权威文档请参阅 <A href="http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html">Java Native Interface 1.5 Specification</A></P>
<P>关于 JNI 函数的教程请参阅 <A href="http://java.sun.com/docs/books/tutorial/native1.1/index.html">Java Native Interface Tutorial</A></P></TD></TR></TBODY></TABLE><!-- 正文结束 --><!-- BEGIN VNV5 FOOTER  -->
<TABLE border=0 cellPadding=0 cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>
<TABLE border=0 cellPadding=0 cellSpacing=0 class=vatop width="100%">
<TBODY>
<TR>
<TD class=grey3 colSpan=2 vAlign=top><IMG alt=" " border=0 height=2 src="http://gceclub.sun.com.cn/include/a.gif" width=1></TD></TR>
<TR>
<TD width=180><IMG alt=" " border=0 height=29 src="http://gceclub.sun.com.cn/include/logo_sun_small_sdn.gif" vspace=5 width=61></TD>
<TD vAlign=top>
<DIV class=footer><A href="http://cn.sun.com/aboutsun/">关于Sun公司</A>&nbsp;|&nbsp;&nbsp;<A href="http://cn.sun.com/contact/">联系我们</A>&nbsp;|&nbsp;&nbsp;<A href="http://cn.sun.com/share/termsofuse.html">使用条款</A>&nbsp;|&nbsp;&nbsp;<A href="http://cn.sun.com/privacy/">隐私政策</A><BR>Copyright 1994-2004 Sun Microsystems, Inc.</DIV></TD></TR>
<TR>
<TD class=grey3 colSpan=2 vAlign=top><IMG alt=" " border=0 height=2 src="http://gceclub.sun.com.cn/include/a.gif" width=1></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- END VNV5 FOOTER --><img src ="http://www.blogjava.net/zuroc/aggbug/2908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-04-07 13:11 <a href="http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏开发的网上资源! </title><link>http://www.blogjava.net/zuroc/archive/2005/04/01/2728.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Fri, 01 Apr 2005 13:38:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/04/01/2728.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2728.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/04/01/2728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2728.html</trackback:ping><description><![CDATA[<STRONG>
<TABLE class=tborder id=post23113 style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word" cellSpacing=1 cellPadding=6 width="100%" align=center border=0>
<TBODY>
<TR>
<TD class=alt2 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
<TABLE cellSpacing=6 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD noWrap>
<DIV id=postmenu_23113 style="CURSOR: pointer" unselectable="true"><A class=bigusername href="http://bbs.gamedev.csdn.net/member.php?u=5688"><FONT color=#22229c>潋滟</FONT></A> <!-- BEGIN TEMPLATE: postbit_onlinestatus --><IMG class=inlineimg title=潋滟现在离线 alt=潋滟现在离线 src="http://bbs.gamedev.csdn.net/images/statusicon/user_offline.gif" border=0> <!-- END TEMPLATE: postbit_onlinestatus -->
<SCRIPT type=text/javascript> vbmenu_register("postmenu_23113", true); </SCRIPT>
</DIV>
<DIV class=smallfont>&nbsp;</DIV></TD>
<TD width="100%">&nbsp;<A href="http://bbs.gamedev.csdn.net/showthread.php?t=4241">http://bbs.gamedev.csdn.net/showthread.php?t=4241</A></TD>
<TD vAlign=top noWrap>
<DIV class=smallfont>
<DIV>注册日期: Oct 2003</DIV>
<DIV>帖子: 0 <!-- BEGIN TEMPLATE: postbit_reputation --><IMG class=inlineimg title="潋滟 is off the scale" alt="潋滟 is off the scale" src="http://bbs.gamedev.csdn.net/images/reputation/reputation_pos.gif" border=0> <!-- END TEMPLATE: postbit_reputation --></DIV>
<DIV></DIV></DIV></TD></TR></TBODY></TABLE><!-- / user info --></TD></TR>
<TR>
<TD class=alt1><!-- message, attachments, sig --><!-- icon and title -->
<DIV class=smallfont><STRONG>游戏开发的网上资源!</STRONG> </DIV>
<HR style="COLOR: #d1d1e1" SIZE=1>
<!-- / icon and title --><!-- message -->
<DIV>我看各位扫书扫的实在是太辛苦了,其实网上有价值的文档还是很多的,如果各位仔细钻研,到无不融会贯通时,必成其大器!<BR>网上的资料大多e文的,不过应该不成问题吧,学计算机,E文是必要技能.<BR>网站:<BR><A href="http://nehe.gamedev.net/" target=_blank><FONT color=#22229c>http://nehe.gamedev.net/</FONT></A> <BR>有很多的OPENGL教程,看透了OPENGL基本修成正果.<BR><BR><A href="http://www.gamasutra.com/" target=_blank><FONT color=#22229c>http://www.gamasutra.com/</FONT></A> <BR>有很多最新的游戏编程技术,紧跟时代潮流吧.<BR><BR><A href="http://developer.nvidia.com/" target=_blank><FONT color=#22229c>http://developer.nvidia.com/ </FONT></A><BR>DX和OPENGL的学习基地,SOURCE CODE,DOCUMENT多.<BR><BR><A href="http://ww.ati.com/" target=_blank><FONT color=#22229c>http://WW.ATI.COM </FONT></A><BR>同上,<BR><BR><A href="http://www.gamespy.net/" target=_blank><FONT color=#22229c>http://www.gamespy.net/ </FONT></A><BR>有一些资料,我也没好好看,因该有一些有用的.<BR><BR><A href="http://udn.epicgames.com/" target=_blank><FONT color=#22229c>http://udn.epicgames.com/ </FONT></A><BR>UNREAL引擎的网站当然要访问全部的网页要注册的才行.<BR><BR><A href="http://www.magic-software.com/" target=_blank><FONT color=#22229c>http://www.magic-software.com </FONT></A><BR>有很多的文档,以后谁再问什么BOUNDING BOX ,BOUNDING SPHERE,FRUSTUM的碰撞检测,叫他们看网去,不过不大好连上,有可以连的DOWN下来SHARE下吧.<BR><BR><A href="http://directory.google.com/Top/Science/Math/Geometry/Computational_Geometry/Software/?il=1" target=_blank><FONT color=#22229c>http://directory.google.com/Top/Sci.../Software/?il=1</FONT></A> <BR>狗狗查出来的一大堆,好多宝贝啊,不要看花了眼睛啊.<BR><BR><A href="http://sourceforge.net/" target=_blank><FONT color=#22229c>http://sourceforge.net/ </FONT></A><BR>有很多半成品,要不要挑个抄抄?不过垃圾太多了.<BR><BR><A href="http://www.opengl.org/developers/documentation/index.html" target=_blank><FONT color=#22229c>http://www.opengl.org/developers/do...tion/index.html</FONT></A> <BR>OPENGL 的官方文档,自己看吧.<BR><BR><A href="http://lib-www.lanl.gov/numerical/bookcpdf.html" target=_blank><FONT color=#22229c>http://lib-www.lanl.gov/numerical/bookcpdf.html</FONT></A><BR>数学方法的全书!你以后看了老外的文章就知道为什么要看这个了!!VERY VERY USRFUL!就是太多太难了.<BR><BR>SIGGRAPH !<BR>图象图形的盛会,网上去查吧,查到了COURSE,PAPER 的 DOWNLOAD 地址别忘了告我.<BR><BR><A href="http://www.cgshaders.org/" target=_blank><FONT color=#22229c>http://www.cgshaders.org/</FONT></A><BR>好多SHADER呀!不过没时间看.<BR><BR><A href="http://www.gamedev.net/community/forums/showfaq.asp?forum_id=12" target=_blank><FONT color=#22229c>http://www.gamedev.net/community/fo...asp?forum_id=12</FONT></A><BR>一个好贴,好多好连接.覆盖3d各方面.<BR><BR>MAILLIST:<BR><A href="https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list" target=_blank><FONT color=#22229c>https://lists.sourceforge.net/lists...algorithms-list</FONT></A><BR>最POP的3D algorithm ,游戏开发MAIL LIST,有时你会看到偶像啊!抓紧机会快问,不要怕E文烂!脸皮厚不吃亏!<BR><BR><A href="http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com" target=_blank><FONT color=#22229c>http://lists.midnightryder.com/list...dnightryder.com</FONT></A><BR>也不差,人气不错!<BR><BR><A href="http://discuss.microsoft.com/archives/DIRECTXDEV.html" target=_blank><FONT color=#22229c>http://discuss.microsoft.com/archives/DIRECTXDEV.html</FONT></A><BR>MS的DX MAILLIST<BR><BR>好了一下子把我搜集的网上资源贡献出来,希望班主置顶,大家继续充实资料库!<BR>在这个信息爆炸的年代的确不用担心找不到资料,怕就怕没有人认真的学习,思考.<BR>这年头成不了伟大的游戏开发只能怪自己!<BR>现在游戏开发是老外的天下,希望有更多的中国人去占领他门的BBS,MAIL LIST,等到在ALGORITHM LIST上看到的都是老张,小李的时候,中国的游戏开发也差不多该成熟了吧!</DIV></TD></TR></TBODY></TABLE></STRONG><img src ="http://www.blogjava.net/zuroc/aggbug/2728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-04-01 21:38 <a href="http://www.blogjava.net/zuroc/archive/2005/04/01/2728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>亚历山大大帝</title><link>http://www.blogjava.net/zuroc/archive/2005/03/31/2668.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Thu, 31 Mar 2005 13:11:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/31/2668.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2668.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/31/2668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2668.html</trackback:ping><description><![CDATA[&nbsp;<A href="http://bbs.verycd.com/forum/t/145011.shtml">《亚历山大大帝》[DVD]</A><IMG style="WIDTH: 195px; HEIGHT: 274px" height=294 alt="user posted image" src="http://images.amazon.com/images/P/B00005JN4R.01.LZZZZZZZ.jpg" width=261 border=0 name=post_img><STRONG>时 长：</STRONG> 175 分钟<BR><BR><STRONG>剧情简介：</STRONG>　　亚历山大大帝生于纪元前356年为马其顿王（菲利普）之子，是历史上第一位征服欧亚大陆的著名帝王。亚历山大自幼聪颖过人，曾受教于大师（亚利斯多德），稍长即被授予首府总督之职，并以平定山贼有功而任命为马其顿大军统帅，随父横扫希腊城邦之乱。 <BR>　　西元前336年菲利普遇刺，亚历山大继任王位并继承乃夫遗志，率领希腊联军进攻波斯，关尼卡卡一役大败波斯并直入小亚细亚攻占两河流域，波斯帝国崩溃，波斯王大流士被杀，又进军埃及又越过印度河进入恒河流域，因军士思乡被迫退回。亚历山大融合东西文化，鼓励民族间通婚，并倡导民族间地位平等，讲希腊思想律法散布各地，开创希腊化时代文化，死时却年仅33岁。<BR><SPAN style="COLOR: red"><STRONG>◆简评：史诗年就差一个完美的句号◆</STRONG></SPAN> <BR>“我这辈子最有意思的事情之一，就是想尽办法拍出前人觉得不可能的电影，或是大家认为无法言喻的事情。”奥立佛·斯通说：“我认为《亚历山大大帝》是我到目前为止最大的挑战。千百年来竟然没有多少人将亚历山大的一生搬上舞台，或拍摄他的传记片。有人说是他实在太伟大，一生有太多故事，难以实现。我认为1956年的那部《亚历山大大帝》(罗伯特·罗森导演，里查·波顿主演)并不出色，它只遵循希腊故事的情节，在亚历山大征服波斯帝国之后就进入了尾声，亚历山大余生最后几年却略而不谈，其实他一生中最有趣或最重要的事情都发生在这段期间。对他，或对当时的世界，那几年有许多重大改变。拍《亚历山大大帝》是我的梦想。” <BR>黑衣人2 Men in Black II<A href="http://www.online.tj.cn/fun/film/newfilms/mib2/6.jpg" target=_blank><IMG height=100 src="http://www.online.tj.cn/fun/film/newfilms/mib2/06.jpg" width=150 border=0></A> <BR>　　 K（汤米·李·琼斯）和杰（威尔·史密斯）这次受到险恶外星人的挑战，再一次联合起来保卫我们最好也是最后一道防御系统免遭破坏，保卫地球不受宇宙害虫的侵袭。距离上一次外星人寻找可以稼祸银河系灾难的星球已经有4年时间了，好不容易过上两天太平日子的K又要被杰拉出来继续他们的“黑衣人”工作，一个非官方的政府机构控制着地球上的外星事务。 
<P>　　在一次常规的犯罪调查中，杰发现萨琳娜（拉腊·弗莱恩·波亦尔）正在策划一起邪恶的阴谋。为了方便行事，这个怪物伪装成一个性感的内衣模特混在人群中。在经过悉心准备后，萨琳娜的魔爪伸向了“黑衣人”大楼，把那里的人们扣押起来当作人质。而现在杰只有一个人可以依靠了，那就是从前的老搭档，现在在美国邮政署享清福、喜欢老婆做的小甜饼胜过一切的K。他们要再一次团结起来对付外星怪兽。</P>
<P>　　这次任务对杰来说不仅是和时间赛跑，更是要让对他们曾经是“黑衣人”的经历毫无印象的K明白：只有他们才能解救银河系于危难--在地球毁灭之前。 </P><img src ="http://www.blogjava.net/zuroc/aggbug/2668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-31 21:11 <a href="http://www.blogjava.net/zuroc/archive/2005/03/31/2668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏开发</title><link>http://www.blogjava.net/zuroc/archive/2005/03/28/2535.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Mon, 28 Mar 2005 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/28/2535.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2535.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/28/2535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2535.html</trackback:ping><description><![CDATA[<A accessKey=1 href="http://bbs.gamedev.csdn.net/">中国游戏开发者</A><BR></TD></TR></TBODY></TABLE><A href="http://www.gameres.com/" target=_blank>www.gameres.com</A><BR><A href="http://www.chinagamedev.net/" target=_blank>www.chinagamedev.net</A><BR><A href="http://www.gametutorials.com/" target=_blank>www.gametutorials.com</A><BR><A href="http://www.gamedev.net" target=_blank>www.gamedev.net</A><img src ="http://www.blogjava.net/zuroc/aggbug/2535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-28 13:22 <a href="http://www.blogjava.net/zuroc/archive/2005/03/28/2535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精品程序书籍下载</title><link>http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Sat, 26 Mar 2005 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2483.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2483.html</trackback:ping><description><![CDATA[<P><A target=blank href="http://www.netyi.net/in.asp?id=zuroc"><FONT size=4>精品程序书籍下载</FONT></A></P><img src ="http://www.blogjava.net/zuroc/aggbug/2483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-26 17:55 <a href="http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse深度解析</title><link>http://www.blogjava.net/zuroc/archive/2005/03/25/2447.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Fri, 25 Mar 2005 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/25/2447.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2447.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/25/2447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2447.html</trackback:ping><description><![CDATA[<DIV style="TEXT-ALIGN: center">
<DIV id=CHSmall>
<DIV id=CHSmallCSDNLogo>CSDN.NET</DIV>
<DIV style="CLEAR: both"></DIV></DIV></DIV><!-- /公共页头 -->
<DIV id=Blocks>
<DIV id=Columns style="PADDING-LEFT: 0px; FLOAT: left; WIDTH: 428px"><IMG src="http://www.csdn.net/subject/eclipse/title.gif"> 
<DIV id=Titles>Eclipse的技术进展</DIV>
<DL>
<DT><A href="http://blog.csdn.net/edh/archive/2005/03/22/326596.aspx">eclipse推出新的technology project proposals</A> 
<DD>偶尔又去eclipse.org看看了，发现了新的好项目 The Graphical Modeling Framework (GMF) ; Language Development Toolkit (LDT) ; Model Driven Development Integration Project (MDDI) 
<DT><A href="http://blog.csdn.net/thl789/archive/2005/03/18/323290.aspx">MDA与Rational基于Eclipse3的新一代建模工具</A> 
<DD>MDA是对象管理组织OMG力图制定的实现MDD(Model-Driven Development)的标准，各大软件领导厂商也都积极参与MDA标准化的工作。现在IBM已经实现了MDD的基于Eclipse平台的产品Rational Software Architect，并在其中集成了过程管理、版本控制、代码复审等功能。 
<DT><A href="http://blog.csdn.net/sean_gao/archive/2005/03/21/325981.aspx">Eclipse项目3.1开发目标和进度</A> 
<DD>Eclipse项目毕竟有多年积淀下来的支持者和开发资源，在迈向3.1的各个版本中，对J2SE 5.0的支持得以逐步完善，至今已经推出3.1M5a版，其对J2SE 5.0在各个子系统的支持也都基本到位了。 </DD></DL></DIV>
<DIV id=Columns style="PADDING-RIGHT: 0px; FLOAT: right; WIDTH: 322px">
<DIV id=Titles>Eclipse组织的扩张</DIV>
<DL>
<DT><A href="http://www.csdn.net/news/newstopic/19/19976.shtml">Borland加入Eclipse董事会 领导推动软件模型技术</A>(2005.03.09) 
<DD>Borland软件公司将进一步加强对开放源代码开发平台 Eclipse的支持。Eclipse 平台被开放源代码支持者所广为称誉，是一个支持多语言的通用部署平台。Borland 加入 Eclipse 基金会（Eclipse Foundation）的董事会后，将以策略性开发者的身份，领导推动 Eclipse 技术的发展。Borland 还将组织一支全职开发队伍，专责扩展 Eclipse 平台，在软件模型等技术领域作出贡献。 
<DT><A href="http://www.csdn.net/news/newstopic/19/19700.shtml">BEA将加入Eclipse开源软件开发工具联盟</A>(2005.2.23) 
<DD>BEA宣布将加入Eclipse基金会组织的开源软件开发工具联盟。BEA将作为顶级成员——“战略制订者”——加入该联盟，并每年为该联盟提供25万美元的资金。除此之外，BEA还必须在一年之内发布至少一个基于Eclipse平台的商业产品。 
<DT><A href="http://www.csdn.net/news/newstopic/19/19400.shtml">CA宣布加入Eclipse基金会 将开放其软件源代码</A>(2005.01.18) 
<DD>CA日前宣布，公司已加入Eclipse 基金会(Eclipse Foundation)，并将向Eclipse测试与性能工具平台(TPTP)顶级项目开放其软件的源代码。此外，CA已被TPTP项目管理委员会(PMC)任命为TPTP监控工具项目组组长。 </DD></DL></DIV>
<DIV style="CLEAR: both"></DIV></DIV>
<DIV id=Blocks>
<DIV id=Titles>Eclipse与NetBeans之争</DIV>
<DL style="MARGIN-BOTTOM: 8px">
<DT><A href="http://blog.csdn.net/kukoo/archive/2005/03/13/318430.aspx">为什么Eclipse的使用者转向了Netbean? (是这样的吗?) </A>
<DD>
<UL>
<LI>Jarod: 我不知道eclipse是不是“越变越慢“（我刚开始用Eclipse已经是3.0），但它的确很慢，在我的C4 2.4G+512M的机器上感觉比JBuilder2005还要慢。平时看别人说Eclipse快，我也觉得奇怪，可能在说2.X版吧。不过我没用过 
<LI>鄙视: 荒诞的说法？ Eclipse快，而NetBean慢；SWT快，而Swing慢；如果是linux环境下，这个就是事实了 </LI></UL>
<DT><A href="http://blog.csdn.net/kukoo/archive/2005/03/16/320890.aspx">Eclipse 和 NetBean (争论的后续)</A> 
<DD>
<UL>
<LI>SEA: 我认为IDEA比Eclipse好用,不信你试试,比.NET还好! 
<LI>Evan: 如果你习惯于使用各类Wizard，并且喜欢在各个菜单、按钮和键盘之间来回切换的话，那么IDEA确实不如Eclipse。如果你学会了使用IDEA的模板和文件模板，并且希望可以用键盘来控制一切而无需写了几行代码就要中途中断去操作鼠标，那么先放下Eclipse，开始试试使用IDEA罢。 </LI></UL>
<DT><A href="http://blog.csdn.net/kukoo/archive/2005/03/16/320890.aspx">隐藏在SWT/Swing背后的故事</A> 
<DD></DD></DL></DIV>
<DIV id=Blocks>
<DIV id=Titles>Eclipse经验谈</DIV>
<DL>
<DT><A href="http://blog.csdn.net/courage_yhb/archive/2005/03/24/328928.aspx">Eclipse3.0下Struts ＋spring＋ hibernate快速入门</A> 
<DD>本文是开发基于spring的web应用的入门文章，前端采用Struts MVC框架，中间层采用spring，后台采用Hibernate。本文包含以下内容：配置Hibernate和事务；装载Spring的applicationContext.xml文件；建立业务层和DAO之间的依赖关系；将Spring应用到Struts中 
<DT><A href="http://blog.csdn.net/casularm/archive/2005/03/23/327991.aspx">关于利用 eclipse+CDT 进行嵌入式开发平台的调研</A> 
<DD>由于Eclipse IDE平台的开放性及其友好的交互界面, 可以很好的以插件的方式植根于Eclipse作为软件开发平台. 我们决定采用CDT(C/C++ Devekopment Toolkit), 并以GCC, GDB为编译调试引擎, Project化的程序管理开发 
<DT><A href="http://blog.csdn.net/qinii/archive/2005/03/23/327882.aspx">Eclipse 3.0 上配置JSP开发环境</A> 
<DD>首先讲一下环境配置，注意我配置的环境是在win 2000 server下的，不是linux下的，配置的大致流程和操作系统无关，仅仅是在具体的安装上有差别。而配置成功与否，与操作系统无关。 
<DT><A href="http://blog.csdn.net/sean_gao/archive/2005/03/22/327219.aspx">Just for fun – 在Eclipse下编译和运行C#的代码</A> 
<DD>仅仅是为了好玩，我们来看一个Eclipse的C#插件，该插件由一家法国公司Improve Technologies开发和维护，目前支持Eclipse 3.0和.NET Framework 1.1。 
<DT><A href="http://blog.csdn.net/rickylan/archive/2005/03/17/322653.aspx">Eclipse Forms Programming Guide(English)</A> 
<DD>This document has been written to help you use the new Eclipse 3.0 feature called 'Eclipse Forms'. The content will eventually move to Eclipse help. In the mean time, you can start experimenting using examples shown below and code in Eclipse 3.0 integration builds. 
<DT><A href="http://blog.csdn.net/kukoo/archive/2005/03/21/325574.aspx">使用RCP而不是Websphere Portal</A> 
<DD>这位仁兄的项目是一个进行预算安排的软件，而且看上去在挺大的范围内使用(across the country)。但是这个项目没有使用Portal或者其他什么B/S架构的系统，而是Eclipse的RCP。 </DD></DL></DIV><img src ="http://www.blogjava.net/zuroc/aggbug/2447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-25 18:53 <a href="http://www.blogjava.net/zuroc/archive/2005/03/25/2447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java多媒体框架设计"自播放电影"</title><link>http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Tue, 15 Mar 2005 12:51:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2110.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2110.html</trackback:ping><description><![CDATA[<TABLE align=center bgColor=#f7f7f7 border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD height=30>
<DIV align=center>
<DIV align=center>作者：　时间： 2004年2月12日 16:47:17　来源：<A href="http://www.yesky.com/" target=_blank>yesky</A></DIV></DIV></TD></TR>
<TR>
<TD bgColor=#f7f7f7>
<TABLE align=center cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;如果把Java媒体框架（http://java.sun.com/jmf）看作客户端安装的媒体播放机的话，那么这种框架并不是非常激动人心。它只支持少量媒体类型，并且事实上这些媒体类型都被象Windows媒体播放机以及QuickTime等其它的应用程序支持。<BR><BR>　　但是从内容供应商的观点来看，下面这个事实更加有意义：JMF在所有的Java类型中都可用，这使在客户端上不必要有任何特定的媒体技术就可以部署媒体--所需要的只是J2SE Java运行时间。<BR><BR>　　更重要的是它能利用.jar文件格式的一些性能把解码器和媒体组成到一个文件中，创建一个"自我播放电影"，使用了象WinZip和StuffIt这样的压缩应用程序大致相同的方式来创建自我展开文档。<BR><BR>　　我们把此分为三个阶段：<BR><BR>　　1．使JMF能够播放.jar文件中的媒体。<BR><BR>　　2．只使用需要播放本地媒体所需的JMF的一部分创建一个轻量级.jar文件。<BR><BR>　　3．将代码和媒体放入.jar文件，并且创建一个合适的manifest文档以使它可以双击。<BR><BR>　　基本的JMF播放的关键是获得Player，能解码和渲染你的媒体。一般来说，这通过使用Manager获得合适的DataSource来完成，在一个播放实例中提供了媒体流和流元数据，例如媒体格式。Manager然后找到一个Player来处理 DataSource。在两种情况下，Manager结合一个带有程序包前缀列表（象javax.media、com.ibm.media等等）的反射方案来试图寻找合适的类，例如如果一个计划的播放程序不能接受提供给它的DataSource，那么它就会抛出异常。<BR><BR>　　Manager没有太多事要做，只是察看一下URL中的协议和文件扩展名，所以虽然它可以很容易的知道如何处理file:///Users/cadamson/mymp3stash/some.mp3，但是它不知道如何处理象jar:file:/Users/cadamson/dev/jmftests/spmovie-old/src/gatsbymovie.jar!/movie/themovie.mov这样的URL。<BR><BR>　　为了缓和这种情况，我们可以写一个DataSource，说得更准确一点就是一个PullDataSource，担负为Manager描述细节的责任。JarEntryDataSource中没有一个方法特别难；我们提供的PullSourceStream还需要实现几个超级接口。 <BR>它有些不够完美，但是这个类依靠文件扩展名来返回"内容类型"。这多多少少有点象一个MIME类型，除了使用句号代替斜线符号来格式化以外，所以它可被用于程序包名称（例如video/mpeg MIME类型变成video.mpeg，所以Manager可以找到com.sun.media.codec.video.mpeg包）。下面是我们的简单的实现：<BR><BR>
<TABLE bgColor=#ffffff width=500>
<TBODY>
<TR>
<TD>
<P>public String getContentType() {<BR>　try {<BR>　　URL url = getLocator().getURL();<BR>　　String urlFile = url.getFile();<BR>　　if (urlFile.endsWith(".mov"))<BR>　　　return "video.quicktime";<BR>　　else if (urlFile.endsWith(".mpg"))<BR>　　　return "video.mpeg";<BR>　　else if (urlFile.endsWith(".avi"))<BR>　　　// Manager needs '_' insted of '-'<BR>　　　return "video.x_msvideo";<BR>　　else<BR>　　　return "unknown";<BR>　} catch (MalformedURLException murle) {<BR>　　　return "unknown";<BR>　}<BR>} </P></TD></TR></TBODY></TABLE><BR>　　另一个烦恼是JMF源代码表明如果提供的流是Seekable的话（这是一个提供随机存取seek()方法的接口），默认Player只能播放一个QuickTime DataSource。如果寻找点在流的非常上流的地方，那么JarEntryDataSource中的策略是使用InputStream.skip()。如果寻找点在当前读取点之后（调用tellPoint，因为它的值通过Seekable.tell ()方法返回），然后它必须关闭InputStream，再重新打开，跳到寻找点。它使用一个内部的thoroughSkip()方法来确定我们实际上停在哪里。<BR><BR>
<TABLE bgColor=#ffffff width=500>
<TBODY>
<TR>
<TD>public long seek (long position) {<BR>　try {<BR>　　if (position &gt; tellPoint) {<BR>　　　thoroughSkip (position - tellPoint);<BR>　　} else {<BR>　　　close();<BR>　　　open();<BR>　　　thoroughSkip (position);<BR>　　}<BR>　　return tellPoint;<BR>　} catch (IOException ioe) {<BR>　　return 0; // bogus...<BR>　}<BR>}</TD></TR></TBODY></TABLE><BR>　　使用这个类，Manager可以找到一个可用的Player用于播放.jar文件中的.mov或者.avi文件。我们的示例的TinyPlayer使用ClassLoader.getResource ()方法来在类路径中寻找movie/themovie.mov或者movie/themovie.avi。当类路径只包含.jar文件的时候，我们将对其进行设置。<BR>
<TABLE align=center cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;准备一个合适的.jar文件中的第一步是使用JMF的jmfcustomizer工具来创建一个jar，只使用播放我们的媒体所需要类，去掉用于流、捕捉、译码和其它对于一个简化的播放程序不需要的函数。不幸的是，Sun在各种Java版本的JMF中都不包含jmfcustomizer的帮助文件，但是各种定制屏幕很容易设计出来：<BR><BR>　　1．媒体源和媒体汇点：选择"媒体文件"和"播放"。<BR><BR>　　2．协议：只是"文件"。<BR><BR>　　3．源媒体格式："QuickTime (.mov)"和"Avi"。<BR><BR>　　4．解码器：无论你计划在你的媒体中使用什么解码器，但是用于音频的大部分都是"A - law"、"U - law"或"IMA4"，用于视频的是"H263"。不要为编码器、封包器和解包器而费心。<BR><BR>　　5．渲染：在音频中，我们需要"JavaSound"用于Java 1.3及1.3以上的版本，SunAudio用于Sun的pre-1.3 JVM。对于视频，我们只需要AWT。<BR><BR>　　其结果是本来用于我们的播放器的jar被从1.9 MB压缩到700K。<BR><BR>　　假定你已经编译了两个com.mac.invalidname.spmovie类，把它们添加到定制的jar中：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar uf customized.jar com/mac/invalidname/spmovie/*.class</TD></TR></TBODY></TABLE><BR>　　JMF的许可证有效期需要它的readme文件使用任何JMF或者定制子集来分布。我已经在misc目录中提供了，在TinyPlayer的菜单项可以找到它：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar uf customized.jar misc/</TD></TR></TBODY></TABLE><BR>　　为了使这个.jar文件可双击，我们提供一个manifest文件告诉Java运行时间在.jar文件中的哪个类中有在双击或者使用简单jar命令行变量的时候调用的main()方法。manifest还提供一个只包含jar自己的类路径：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>Main-Class: com.mac.invalidname.spmovie.TinyPlayer<BR>Class-Path: .</TD></TR></TBODY></TABLE><BR>　　这个manifest使用下面的命令来添加：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar ufm customized.jar manifest-stub.txt</TD></TR></TBODY></TABLE><BR>　　这个文件现在有用于播放jar中的一个电影的所有的代码。为了将来之用，请把它保存为spmovie-engine.jar文件，或者类似的文件。<BR><BR>　　现在引擎已经具备了，我们所需要的只有媒体了。正如你可从JMF支持类型页面&lt;http://java.sun.com/products/java-media/jmf/2.1.1/formats.html&gt;看到的那样，所有Java版本的JMF有一个相当有限的所支持解码器的集合。对于视频来说最好的选择可能是H.263，在很广泛的比特率下能够工作的很好，然而它可能在老机器上会执行得很困难，除非你压缩视频或者保持较低的帧速率。虽然音频较少是事先准备好的，但是我想IMA 4:1执行得相当好。适当地编码或者译码你的媒体，并且把它复制为movie/themovie.mov或者movie/themovie.avi。如果你喜欢你也可以把.jar文件改名（我使用spmovie.jar）并且添加媒体：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar u0f spmovie.jar media/</TD></TR></TBODY></TABLE><BR>　　注意这里的"0"是数字零，而不是字母O；这表明我们不想压缩这个输入项，因为我们的媒体已经被压缩了。<BR><BR>　　千辛万苦，我们的自我播放电影终于做成了，这个文件知道在双击的时候运行什么类，提供了多路解编、解码和渲染一部电影所需的所有的代码，以及电影本身。如果你想看看这种小型自我播放电影，你可以去&lt;http://homepage.mac.com/invalidname/spmovie/spmovie-small.jar&gt;看看。<BR><BR>　　它扩展了小应用程序的概念，允许媒体在任何可用于Java的浏览器中播放。<BR><BR>　　说白了，它是一个Java虚拟机而不是媒体播放机。但是我们这种"一次编辑，到处播放"的思想是完全符合Java的原先的目的的。<BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/zuroc/aggbug/2110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-15 20:51 <a href="http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT指南</title><link>http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Sun, 13 Mar 2005 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1984.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1984.html</trackback:ping><description><![CDATA[<!--StartFragment -->&nbsp;1998年，有一位程序员改变了整个Java世界。James Duncan Davidson在试图使用当时的构建工具（GNU Make、批处理文件和shell脚本）来创建一个跨平台的Tomcat构建时，做了多种努力均不能成功。因此，他在从欧洲飞回美国的途中设计出了自己的构建实用工具，并为之命名为Ant，因为这是一个小东西，但却能做大事。James为了解决自己的问题（即创建一个跨平台的构建）而提出的这种快速而简单的解决方案已经演变成Java环境中应用最为广泛的构建管理工具。<BR>如果你在用Java进行开发，而没有使用Ant，那么确实应该拥有这本不算厚的书。Ant是一个可靠的、跨平台的构建工具，它可以充分利用Java环境的优势。Ant本身也是用Java编写的，它可在多个平台（如Unix、Linux以及Windows等等）上工作，因此如果你要转换开发平台，那么学习 Ant是值得的。Ant很容易扩展。在你的工程中，目前是否存在某个需求，而所有Ant功能对此都不能予以满足呢？没有问题！你完全可以像James一样，编写自己的Ant任务。没准儿你也能改变这个世界呢！<BR>以下是使用Ant可以完成的一些工作：<BR>* 定义构建块、它们必须产生的结果以及它们之间的依赖关系<BR>* 自动地由诸如CVS等源代码控制系统获取源代码<BR>* 不仅可令Ant以适当的顺序编译必要的源文件，而且还可生成部署所必需的JAR文件，由此完成应用的构建<BR>* 仅需由一个构建文件（或一组构建文件）即可完成以上所有工作，而构建文件在Ant支持的所有平台上都会有同样的表现<BR>要进行eXtreme（极限）编程吗？Ant就是一个必备工具，利用它可以方便地完成频繁的构建，以此又将有利于使用JUnit和相关技术进行测试驱动的开发。<BR>Ant构建文件是用XML编写的，这是一种良构标准，因此可以确保使用Ant并不需要学习另一种脚本语言。Ant是一个开源工程，这是Apache软件基金会所投资的Jakarta工程的一部分。<BR>“Jesse和Eric可以教你如何使用当前的Ant，他们做得相当棒。这本书提供了颇有深度的信息，对于一些以往从未考虑到的工作，书中还介绍了如何扩展Ant来完成这些工作的详细内容。不论你是偶尔使用Ant，还是需要管理各种大型工程，这都是一本需要持之在手的工具书。”<BR>—James Duncan Davidson，Ant的创造者 <img src ="http://www.blogjava.net/zuroc/aggbug/1984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-13 14:04 <a href="http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Macromedia Flex 教程: Flex入门</title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1882.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1882.html</trackback:ping><description><![CDATA[<P>Macromedia Flex 教程: Flex入门 （1）</P>
<P><STRONG>创建第一个Flex应用程序</STRONG></P>
<P>作者：Robert Crooks (<A href="http://www.macromedia.com/support/training/" target=_blank>Macromedia培训小组</A>)<BR>翻译：MoonFun.qhwa</P>
<P>轉載請註明來自藍色理想</P>
<P>在本教程中，你可以阅读到Flex的简单介绍，还可以利用MXML创建一个简单的分类购物车，从而学习到Macromedia Flex应用程序的基本构成。你将会学到：创建一个应用程序、添加一个布局的容器、添加控件、创建与控件关联的简单数据模型，以及利用ActionScript对事件进行处理。</P>
<P>本文是Robert Crooks编写的四步Flex入门系列的第一部分，Robert Crooks现就职于<A href="http://www.macromedia.com/support/training/" target=_blank>Macromedia客户培训部门</A></P>
<P><A href="http://www.macromedia.com/devnet/flex/articles/calculator.html" target=_blank>Flex 入门 （2）：创建一个Flex计算器<BR></A><A href="http://www.macromedia.com/devnet/flex/articles/containers.html" target=_blank>Flex 入门 （3）：使用容器</A><BR><A href="http://www.macromedia.com/devnet/flex/articles/datamodel.html" target=_blank>Flex 入门 （4）：使用数据模型</A></P>
<P>点击这里下载整个系列教程： <A href="http://www.blueidea.com/articleimg/2004/08/2130/learningflexbasics.zip" target=_blank>Flex入门系列</A>(144KB)</P>
<P>如果你需要更加详细的信息，<A href="http://www.macromedia.com/support/training/" target=_blank>Macromedia客户培训小组</A>提供了为期两天的在线培训课程：《利用Flex开发丰富的互联网应用程序》，教你快速学习Flex应用程序开发。 让我们开始吧！</P>
<P>如果你是一个XML新手，请记住下面的基本规则</P>
<P>如同所有的XML语言一样，在MXML中，标签和属性都是区分大小写的；<BR>所有的属性值必须用双引号(")或单引号(包含<BR></P>
<P><SPAN lang=ZH-CN>所有的标签必须是闭合的。没有子标签的标签可以以斜杠直接结束，而无需额外的结束标签：</SPAN></P>
<P><SPAN lang=EN-US><SPAN class=code><SPAN lang=EN-US>&lt;mx:Label text="Hello"&gt;&lt;/mx:Label&gt;</SPAN></SPAN></SPAN></P>
<P><SPAN lang=ZH-CN>或</SPAN></P>
<P><SPAN lang=EN-US><SPAN class=code><SPAN lang=EN-US>&lt;mx:Label text="Hello"/&gt;</SPAN></SPAN></SPAN></P>
<P><SPAN lang=ZH-CN>如果你是一个</SPAN><SPAN lang=EN-US>ActionScript新手</SPAN><SPAN lang=ZH-CN>，你可以发现它的语法和你熟悉的语言的语法很相近，比如</SPAN><SPAN lang=EN-US>JavaScript</SPAN><SPAN lang=ZH-CN>或者</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN lang=ZH-CN>。请记住这些基本的规则：</SPAN></P>
<P><SPAN lang=EN-US>ActionScript</SPAN><SPAN lang=ZH-CN>是区分大小写的<BR></SPAN><SPAN lang=ZH-CN>语句必须以分号</SPAN><SPAN lang=EN-US>(;)</SPAN><SPAN lang=ZH-CN>结尾</SPAN></P>
<P><SPAN lang=ZH-CN><STRONG>本教程包含的内容：</STRONG></SPAN></P>
<P><SPAN lang=EN-US>1. Flex</SPAN><SPAN lang=ZH-CN>简单介绍<BR></SPAN><SPAN lang=EN-US>2. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Application (</SPAN><SPAN lang=ZH-CN>应用程序</SPAN><SPAN lang=EN-US>)</SPAN><SPAN lang=ZH-CN>标签<BR></SPAN><SPAN lang=EN-US>3. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Panel (</SPAN><SPAN lang=ZH-CN>面板</SPAN><SPAN lang=EN-US>)</SPAN><SPAN lang=ZH-CN>容器<BR></SPAN><SPAN lang=EN-US>4. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Label (</SPAN><SPAN lang=ZH-CN>标签</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>5. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Text (</SPAN><SPAN lang=ZH-CN>文本</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>6. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Button (</SPAN><SPAN lang=ZH-CN>按钮</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>7. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>ComboBox (</SPAN><SPAN lang=ZH-CN>下拉列表</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>8. </SPAN><SPAN lang=ZH-CN>如何创建一个数组对象<BR></SPAN><SPAN lang=EN-US>9. </SPAN><SPAN lang=ZH-CN>如何绑定数据到控件对象<BR></SPAN><SPAN lang=EN-US>10. </SPAN><SPAN lang=ZH-CN>如何用</SPAN><SPAN lang=EN-US>ActionScript</SPAN><SPAN lang=ZH-CN>处理用户事件</SPAN></P>
<P><SPAN lang=ZH-CN><STRONG>准备条件</STRONG>：</SPAN></P>
<P><SPAN lang=ZH-CN>完成本教程必须具备的软件和文件：</SPAN></P>
<P><SPAN lang=EN-US><STRONG>Macriomedia Flex</STRONG></SPAN></P>
<P><SPAN lang=ZH-CN>（可以在</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>支持的平台和服务器上安装运行）试用版的</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>只有光盘供应，请从</SPAN><SPAN lang=EN-US>Macromedia</SPAN><SPAN lang=ZH-CN>销售处购买，售价</SPAN><SPAN lang=EN-US>$8.99. </SPAN><SPAN lang=ZH-CN>试用版的相关信息，请访问</SPAN><SPAN lang=EN-US>: <A class="" href="http://www.macromedia.com/software/flex/productinfo/faq/" target=_blank><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>常见问题</SPAN></A></SPAN></P>
<P><SPAN lang=ZH-CN><A class="" href="http://www.macromedia.com/go/devcenter_flex_try" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/try_icon.gif" width=16>试用</SPAN></A></SPAN><SPAN lang=ZH-CN> <A class="" href="http://www.macromedia.com/go/devcenter_flex_buy" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/buy_icon.gif" width=16></SPAN><SPAN lang=ZH-CN>购买</SPAN></A></SPAN></P>
<P><SPAN lang=EN-US>Dreamweaver MX 2004 </SPAN><SPAN lang=ZH-CN>或其他文本编辑器（例如记事本），用来编辑</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN lang=ZH-CN>和</SPAN><SPAN lang=EN-US>ActionScript</SPAN><SPAN lang=ZH-CN>代码</SPAN></P>
<P><SPAN lang=ZH-CN><A class="" href="http://www.macromedia.com/go/devcenter_dw_try" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/try_icon.gif" width=16>试用</SPAN></A></SPAN><SPAN lang=ZH-CN> <A class="" href="http://www.macromedia.com/go/devcenter_dw_buy" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/buy_icon.gif" width=16></SPAN><SPAN lang=ZH-CN>购买</SPAN></A></SPAN></P>
<P><SPAN lang=ZH-CN><STRONG>准备知识：</STRONG></SPAN></P>
<P><SPAN lang=ZH-CN>阅读</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>简介<BR></SPAN><SPAN lang=ZH-CN>会浏览一个</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>应用程序<BR><BR><STRONG>Flex 简介</STRONG> </P>
<P>Macromedia Flex 是一个用来创建丰富信息的互联网应用程序的服务器组件。Flex内置的界面可以由Macromeida Flash播放器显示在客户端系统上。Flex的本质是：</P>
<P>
<UL>
<LI>一个描述应用程序界面的XML语言 (MXML) 
<LI>一个ECMA规范的脚本语言(ActionScript)，处理用户和系统的事件，构建复杂的数据模型 
<LI>一个类库 
<LI>运行时的即时服务 
<LI>一个由MXML文件生成SWF文件的编译器</LI></UL>
<P></P>
<P><STRONG>MXML</STRONG></P>
<P>MXML是一种描述Flex應用程序構造的XML1.0语言。每个MXML文件应该以一个XML声明开始：<SPAN class=code>&lt;?xml version="1.0"?&gt;</SPAN></P>
<P>和其他XML语言一样，MXML包含元素（标签）和属性，对大小写敏感。标签名称以大写字母开头，大小写混合，必须有对应的结束标签：<BR><SPAN class=code>&lt;ComboBox&gt;&lt;/ComboBox&gt;</SPAN></P>
<P>也可以这样结束对没有内容的标签：<BR><SPAN class=code>&lt;ComboBox/&gt;</SPAN></P>
<P>属性以小写字母开头，大小写混合。属性必须包含在引号内。<BR><SPAN class=code>&lt;ComboBox id="myCombo"/&gt;</SPAN></P>
<P>除了click或initialize之类的事件之外，所有的属性都被编译器作为文本字符串处理。如果需要绑定数据或者强迫编译器执行表达式，可以将变量的部分用花括号包起来：<BR><SPAN class=code>&lt;ComboBox dataProvider="{myArray}"/&gt;</SPAN></P>
<P>大部分的属性都可以作为子标签：<BR><SPAN class=code>&lt;ComboBox dataProvider="{myArray}"/&gt;</SPAN><BR>等效于：<BR><SPAN class=code>&lt;ComboBox&gt; &lt;dataProvider&gt;{myArray}&lt;/dataProvider&gt; &lt;/ComboBox&gt;</SPAN></P>
<P>描述应用程序的MXML文件必须有一个位于其他元素之外的Application元素：<BR><SPAN class=code>&lt;?xml version="1.0"?&gt;&nbsp; <BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp; [other elements...]&nbsp; <BR>&lt;/mx:Application&gt;</SPAN></P>
<P>注意xmlns属性，它声明了XML的命名空间。命名空间可以让你在单个文档中使用多重XML语言而避免混淆不同语言中相同的元素名称。这里的":mx"就是一个在特定命名空间中使用的前缀。</P>
<P>注意：这里定义的命名空间是标准的MXML类库，请将它包含在每个MXML文件中。</P>
<P>可以将声明放在任何MXML标签中；声明对该标签嵌套的所有标签有效。本系列教程中都以mx作为MXML类库的前缀。</P>
<P>如需更多信息，<A class="" href="http://livedocs.macromedia.com/flex/" target=_blank>请参阅 Flex语言参考</A></P>
<P><STRONG>ActionScript</STRONG></P>
<P>ActionScript是一种类似JavaScript和其他ECMA规范的面向对象的脚本语言。如果你使用过JavaScript或Java/C#等其他面向对象的语言，你可以发现它们的语法很相似。你可以在MXML文件中嵌入ActionScript代码，也可以从独立的外部文件导入代码。</P>
<P>完整的ActionScript参考： <A class="" href="http://livedocs.macromedia.com/flex/" target=_blank>Action 语言参考</A></P>
<P><BR><STRONG>MXML类库</STRONG></P>
<P>Flex既包含控制和容器等可见的组件，也包括了远程服务对象和数据模型等的不可见组件。你可以在后面的介绍中得到详细的信息。</P>
<P><STRONG>运行时服务</STRONG></P>
<P>Flex提供了多项运行时服务，如：历史控制和远程服务连接对象。以开发的角度看，这些服务都是对类库的调用。</P>
<P><STRONG>编译器</STRONG></P>
<P>Flex编译器会在收到一个浏览器访问MXML文件的请求后，自动编译生成相应的SWF文件。该SWF文件将被缓存，直到你修改了源MXML文件。<BR><BR></P>
<P><STRONG>创建应用程序</STRONG></P>
<P>在这个简单的购物车中，我们显示一个咖啡品牌的列表（类似于HTML的select）。使用数据绑定功能在下面显示当前选择的品牌的说明，还有一个添加到购物车的按钮，当按钮被按下后，该品牌的咖啡便会被添加到购物列表中。</P>
<P align=center><IMG alt="" border=0 height=314 src="http://www.blueidea.com/articleimg/2004/08/2130/fig1.gif" width=212></P>
<P align=center>图1. 教程创建的Flex应用程序</P>
<P>这个教程的目的是为了学习使用：</P>
<P>Application (应用程序)类<BR>Panel (面板)容器<BR>Script (脚本)元素<BR>Array (数组)元素<BR>Object (对象)元素<BR>Label (标签)元素<BR>Text (文本框)元素<BR>Button (按钮)控件<BR>ComboBox (下拉列表)控件<BR>List (列表)控件<BR>一个ActionScript函数</P>
<P><BR><STRONG>创建Application（应用程序）对象</STRONG></P>
<P>任何一个Flex程序都是以XML声明开始和Application标记的。Application标签包含一个MX类库命名空间的声明：xmlns:mx="http://www.macromedia.com/2003/mxml" 。引用该类库的所有标签必须以mx作为前缀。</P>
<P>1. 创建一个新文件 ，然后保存为 firstapp.mxml，位于flex_tutorials目录下<BR>2. 在文件的开始处，插入XML声明：<BR><SPAN class=code>&lt;?xml version="1.0"?&gt;</SPAN><BR>3. 在XML声明后，添加带命名空间的Application标签：<BR><SPAN class=code>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&lt;/mx:Application&gt;</SPAN></P>
<P><STRONG>应用程序布局：添加一个面板</STRONG></P>
<P>通常你可以将Flex应用程序中可见的组件放置于容器中，容器提供了绑定文本、控件、图像和其他媒体类型的元素。在这里，你可以使用称为“面板”(Panel)的容器，它可以提供大部分应用程序需要的全部外壳。你还可以使用面板的title(标题)属性，修改面板上方自动包含着的标题榄的文字。</P>
<P>4. 在Application标签内部，添加一个Panel标签，title属性为"my First Flex App"</P>
<P><SPAN class=code>&lt;mx:Panel title="My First Flex App"&gt;<BR>&lt;/mx:Panel&gt;</SPAN></P>
<P><STRONG>添加一个显示标题的Label元素</STRONG></P>
<P>Label元素可以用来显示单行文本。它有一些属性，这里用到的是text（文本）属性，定义Label显示的内容。</P>
<P>5. 在Panel标签内，插入一个带有文本属性的Label标签，如下：<SPAN class=code>&lt;mx:Label text="Coffee Blends"/&gt;</SPAN></P>
<P>6. 保存文件，预览一下程序</P>
<P><STRONG>添加一个定义咖啡品牌的数组对象</STRONG></P>
<P>本程序的数据模型是一个简单的数组（内容是一系列的对象），你可以直接在程序中用Array和Object元素创建。这里每个数组单元对象都有两个属性：label和data，你可以将这两个属性写成对象的子标签。用这两个属性名称是为了提供给ComboBox和List这样的控件元素使用，稍后我们会介绍。</P>
<P>这些控件元素可以使用更加复杂的数据对象，但是既然现在是手工创建数据模型，我们就使用简单的形式。通常的语法是：</P>
<P><SPAN class=code>&lt;mx:Array id="identifier"&gt;<BR>&nbsp; &lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label&gt;literal string&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;data&gt;another literal string&lt;/data&gt;<BR>&nbsp; &lt;/mx:Object&gt;<BR>&lt;/mx:Array&gt;</SPAN></P>
<P>留意这里的ID属性。ID几乎是所有Flex元素都具备的属性，它将元素“贴”上标志以区分其他元素。如果你要在数据绑定或ActionScript中使用这个元素，最好给它指定一个ID。</P>
<P>不可见元素可以由你随意摆放，但是把他们放到程序的首部--即可见元素的前面--是一个好习惯。</P>
<P><SPAN class=code>&lt;mx:Array id="coffeeArray"&gt;<BR>&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&lt;label&gt;Red Sea&lt;/label&gt;<BR>&nbsp;&nbsp;&lt;data&gt;Smooth and fragrant&lt;/data&gt;<BR>&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&lt;label&gt;Andes&lt;/label&gt;<BR>&nbsp;&nbsp;&lt;data&gt;Rich and pungent&lt;/data&gt;<BR>&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&lt;label&gt;Blue Mountain&lt;/label&gt;<BR>&nbsp;&lt;data&gt;Delicate and refined&lt;/data&gt;<BR>&nbsp;&lt;/mx:Object&gt;<BR>&lt;/mx:Array&gt;</SPAN></P>
<P><BR><STRONG>添加一个显示咖啡品牌的ComboBox</STRONG></P>
<P>Flex的ComboBox类似于HTML的select功能，而且更加强大。需显示的数组由dataProvider属性指定。你可以在dataProvider标签中直接创建数组，但是更为常用的方法是在别处创建或导入一个数组，然后在dataProvider处指定：</P>
<P><SPAN class=code>&lt;mx:ComboBox id="myCombo" dataProvider="{myArray}"/&gt;</SPAN></P>
<P>这里的大括号告诉编译器：里面是一个变量或者代求算的变量，而不是字符串。</P>
<P>如果对象包含label和data属性，他们会自动按显示数据（label）和关联数据（data）区分，data可以是简单的值，也可以是复杂的类型（如对象）。如果对象既没有label属性也没有data属性，那么整个对象将作为data属性，而label属性则为由ComboBox的labelField属性指定的对象属性。例如ComboBox的labelField值为"name"，那么label的值就为对象的name属性。</P>
<P>8. 在Label之后添加一个ComboBox，id取为coffeeComb，使用dataProvider属性将CombBox绑定到上一步创建的coffeeArray数组：</P>
<P><SPAN class=code>&lt;mx:ComboBox id="coffeeCombo" dataProvider="{coffeeArray}"/&gt;</SPAN></P>
<P><STRONG>添加一个显示说明的Text(文本)控件</STRONG></P>
<P>Text控件与Label相似，不同的是它可以显示多行数据。这里我们用它来显示ComboBox中选中的咖啡品牌的说明。这里要用到ComboBox中选择的项目的data属性。</P>
<P>9. 在ComboBox之后，添加一个带有text属性的文本控件，将text属性设置为“Description:”然后加上一个到ComboBox选择项目的data属性的绑定：</P>
<P><SPAN class=code>&lt;mx:Text text="Description: {coffeeCombo.selectedItem.data}"/&gt;</SPAN></P>
<P><BR><STRONG>添加一个增加咖啡品牌到购物栏的按钮</STRONG></P>
<P>Button控件很简单。它有一个label的属性来设置显示的文字，还有一个click事件，用来指定鼠标点击事件的处理动作。</P>
<P>在这里，我们添加一个按钮，通过调用一个addToCart函数，把ComboBox中选择的项目添加到购物栏中。我们将在后面创建这个函数。</P>
<P>10. 添加一个显示“Add to Cart”的按钮，被点击后调用addToCart函数：</P>
<P><SPAN class=code>&lt;mx:Button label="Add to Cart" click="addToCart()"/&gt;</SPAN></P>
<P><STRONG>给购物车添加一个List（列表）控件</STRONG></P>
<P>List控件和ComboBox唯一的区别是它能同时显示和选择多条项目。这里用的List不需要指定dataProvider属性了，因为它在用户添加数据前是空的。</P>
<P>11. 在按钮之后，添加一个List控件，id取为cart:</P>
<P><SPAN class=code>&lt;mx:List id="cart"/&gt;</SPAN></P>
<P>添加一段处理按钮点击事件的脚本</P>
<P>教程的最后一步是添加一段ActionScript脚本，用来处理按钮的点击事件。在这个简单的应用程序中，我们在Script标签中添加脚本。</P>
<P>Script标签中的ActionScript代码将被包含在 &lt;![CDATA[&nbsp; ]]&gt; 里面，这个标志里面的内容不被XML解析器解析。这个是标准的XML用法，在这里是为了保护ActionScript的一些可能会被XML解析器误处理的一些字符（如&lt;等），实际上这样不仅保护了这些字符，也省去了XML解析器解析ActionScript内容。</P>
<P>这里用到的ActionScript语法很简单，函数的通常语法是：</P>
<P><SPAN class=code>function 函数名(参数1:数据类型...):返回数据类型<BR>{<BR>&nbsp;[ActionScript 语句]<BR>}</SPAN></P>
<P>在addToCart函数中，使用List类的addItem方法添加项目。该方法需要有label参数和data参数，这些参数正好是ComboBox中选中的项目的label属性和data属性。</P>
<P>12. 在Array标签之后，插入一个带有CDATA包装的Script标签：</P>
<P><SPAN class=code>&lt;mx:Script&gt;<BR>&nbsp;&nbsp;&lt;![CDATA[]]&gt;<BR>&lt;/mx:Script&gt;</SPAN></P>
<P>13. 在CDATA里面，添加一个名为addToCart不返回任何值的函数：</P>
<P><SPAN class=code>function addToCart():Void<BR>{<BR>}</SPAN></P>
<P><BR>14. 在函数体内部，使用List类的addItem方法将ComboBox中所选项目label属性和data属性添加到List上。</P>
<P><SPAN class=code>cart.addItem(coffeeCombo.selectedItem.label,coffeeCombo.selectedItem.data);</SPAN></P>
<P>15. 保存文件，在浏览器中预览应用程序 （查看浏览MXML文件的方法见第一页）</P>
<P><BR><SPAN class="">&nbsp;</P>
<P>firstapp.mxml完整的代码：</P>
<P><SPAN class=code>&lt;?xml version="1.0"?&gt;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml" &gt;<BR>&nbsp;&lt;!-- data model --&gt;<BR>&nbsp;&lt;mx:Array id="coffeeArray"&gt;<BR>&nbsp;&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;label&gt;Red Sea&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;data&gt;Smooth and fragrant&lt;/data&gt;<BR>&nbsp;&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;label&gt;Andes&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;data&gt;Rich and pungent&lt;/data&gt;<BR>&nbsp;&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;label&gt;Blue Mountain&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;data&gt;Delicate and refined&lt;/data&gt;<BR>&nbsp;&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&lt;/mx:Array&gt;<BR>&nbsp;&lt;mx:Script&gt;<BR>&nbsp;&nbsp;&lt;![CDATA[<BR>&nbsp;&nbsp;&nbsp;function addToCart():Void<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;cart.addItem(coffeeCombo.selectedItem.label,coffeeCombo.selectedItem.data);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;]]&gt;<BR>&nbsp;&lt;/mx:Script&gt;<BR>&nbsp;&lt;!-- view --&gt;<BR>&nbsp;&lt;mx:Panel title="My First Flex App"&gt;<BR>&nbsp;&nbsp;&lt;mx:Label text="Coffee Blends"/&gt;<BR>&nbsp;&nbsp;&lt;mx:ComboBox id="coffeeCombo" dataProvider="{coffeeArray}"/&gt;<BR>&nbsp;&nbsp;&lt;mx:Text text="Description: {coffeeCombo.selectedItem.data}"/&gt;<BR>&nbsp;&nbsp;&lt;mx:Button label="Add to Cart" click="addToCart()"/&gt;<BR>&nbsp;&nbsp;&lt;mx:List id="cart"/&gt;<BR>&nbsp;&lt;/mx:Panel&gt;<BR>&lt;/mx:Application&gt;</SPAN></P>
<P></SPAN></P>
<P><BR><STRONG>进一步学习</STRONG></P>
<P>在这个简单的例子中，我们学习了Flex的一些核心元素：容器、控件、数据模型、数据绑定和事件处理。你可以继续看本系列教程：</P>
<P><A class="" href="http://www.macromedia.com/devnet/flex/articles/calculator.html" target=_blank>Flex 入门 （2）：创建一个Flex计算器</A><BR><A class="" href="http://www.macromedia.com/devnet/flex/articles/containers.html" target=_blank>Flex 入门 （3）：使用容器<BR></A><A class="" href="http://www.macromedia.com/devnet/flex/articles/datamodel.html" target=_blank>Flex 入门 （4）：使用数据模型</A></P>
<P>你也可以下載整个教程：<A class="" href="http://www.blueidea.com/articleimg/2004/08/2130/learningflexbasics.zip" target=_blank>Flex入门(1-4)</A>。<BR></P></SPAN><img src ="http://www.blogjava.net/zuroc/aggbug/1882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 17:36 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>