<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); 	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); 	$App 	= new App();	$Nav	= new Nav();	$Menu 	= new Menu();		include($App->getProjectCommon());

$pageTitle = "Generating the SWT JNI Code for SWT 3.4";

ob_start();
?>
<div id="midcolumn">
<h1>Generating the SWT JNI Code for SWT 3.4</h1>

<p>All of the C code used by SWT is generated by the <b>JNIGeneratorApp</b>
application from the <i>org.eclipse.swt.tools</i> project in Eclipse CVS.
This page describes how to use this tool when fixing bugs or adding
features to SWT.</p>

<h3>Adding native methods</h3>

<ol>
<li>Add the function prototype in <tt>OS.java</tt>, copying the style and structure
    of the other functions in that file.
    <p></p>
<li>Run <b>JNIGeneratorAppUI</b> from <i>org.eclipse.swt.tools</i>.  This
    is a GUI application for editing the metadata and a front end to the
    generation phase.  Select the appropriate class in the list and then
    find the method you added in <tt>OS.java</tt>.
    <p></p>
    <center><img src="images/jnigen.png" alt="JNIGeneratorAppUI"></center>
    <p></p>
<li>Set any flags and modify the casts for any primitive types.
    <p></p>
<li>Hit <i>Generate All</i> to generate the C code and metadata files.
    <p></p>
<li>Refresh the <i>org.eclipse.swt</i> project to tell Eclipse about the C
    changes, and refresh the <i>org.eclipse.swt.tools</i> project to see the
    metadata changes.
    <p></p>
<li>Compile the new C code and copy the new libraries to the appropriate
    fragment.  To compile the code, right-click on the <tt>build.xml</tt> file in the
    <tt>Eclipse SWT PI/ws/library</tt> directory for your window system, and choose
	"Run As -> Ant Build...". Select the JRE tab, and check "Run in the same JRE as the workspace".
    Select the Refresh tab, and check "Refresh resources upon completion" to refresh your workspace
    after running the build to ensure Eclipse picks up the fresh binaries. Now select the "Run" button.
    <p></p>
    <center><img src="images/buildxml.png" alt="build.xml"></center>
    <p></p>
</ol>

<h3>Adding structs</h3>

<p>Often, methods return values or require parameters as a C struct.  To
add a new structure, simply add a new class in the same package as
the OS.java file which matches the definition of the C structure.
This will be picked up and correctly handled by <i>JNIGeneratorApp</i>.</p>

<p>If a struct is input-only or output-only, this information can be used
by <i>JNIGeneratorApp</i> to generate more efficient C code.  Use the
<b>flags</b> attribute of the native function to indicate this in the
metadata.</p>

<h3>More Hints</h3>

<ul>
<li>For GTK+ and Motif, all native functions must be wrapped in locking
    code.  When adding functions, simply copy the style and structure of the
    other native functions.
<li>Many functions on Mac OS X return structs which use <b>unions</b>.  For
    an example of how to add the markup for a union, see the
    <b>ControlFontStyleRec</b> structure and its metadata.
</ul>

<p>And there you go!  If you're having trouble, please post to the SWT
mailing list or file a new bug in bugzilla.</p>

</div>
<?php 
$html = ob_get_clean();

# Generate the web page
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>