home *** CD-ROM | disk | FTP | other *** search
/ Programming with VisualAge for Java / IBMVJAVA.ISO / vajwin / data1.cab / Ide / relnotes / jcl.txt < prev    next >
Encoding:
Text File  |  1997-07-04  |  24.6 KB  |  597 lines

  1. ============================================================================
  2.  
  3.                         VisualAge for Java
  4.                            Version 1.0
  5.  
  6.            Java Class Libraries and Program Execution
  7.  
  8.                           RELEASE NOTES
  9.  
  10. ============================================================================
  11.  
  12. Table of Contents
  13.  
  14. 1.0 Introduction
  15.  
  16. 2.0 The Class Libraries
  17.   2.1 General Notes
  18.   2.2 package java.lang
  19.     2.2.1 Math
  20.     2.2.2 Threads
  21.     2.2.3 Exceptions
  22.     2.2.4 Class Loader
  23.   2.3 package java.awt
  24.     2.3.1 Widgets
  25.     2.3.2 Graphics
  26.   2.4 package java.io
  27.   2.5 package java.applet
  28.     2.5.1 Sound support
  29.     2.5.2 Applet security
  30.   2.6 package java.util
  31.     2.6.1 Locale support
  32.   2.7 package sun.jdbc.odbc
  33.   2.8 package sun.tools.jar
  34.  
  35. 3.0 Program Execution
  36.   3.1 Java threads
  37.     3.1.2 Terminating threads in the Debugger
  38.   3.2 Object mutation
  39.   3.3 Object finalization
  40.   3.4 JNI
  41.     3.4.1 Unsupported JNI API
  42.     3.4.2 JNI on OS/2
  43.  
  44.  
  45. 1.0 Introduction
  46.  
  47. This release note provides information, which can not be found elsewhere,
  48. on the class libraries provided with VisualAge for Java Version 1.0 . In 
  49. addition, it describes how programs are executed within the VisualAge for 
  50. Java environment.
  51.  
  52.  
  53. 2.0 The Class Libraries
  54.  
  55. 2.1 General Notes
  56.  
  57. This release is based on the Sun JDK 1.1.1 class libraries. In general,
  58. there is a very high degree of compatibility between the Sun JDK and 
  59. VisualAge implementations. However, there are some differences. In
  60. the following sections, we will describe these differences, but they
  61. can be broken down into the following major areas:
  62.  
  63.     - The AWT peer classes provided with VisualAge are based on a 
  64.       stable, multi-platform class library which uses real platform 
  65.       widgets as the underlying implementation. This allows us to provide 
  66.       capabilities such as execution of multiple simultaneous Java 
  67.       programs within a single execution environment, live edit of AWT 
  68.       widgets within the development tools, and correct platform specific 
  69.       behavior from portable application code.
  70.  
  71.     - All native methods provided with VisualAge for Java have been
  72.       implemented by the VisualAge team. In the few cases, where the Sun 
  73.       JDK 1.1.1 implementation differs from the Sun specified behavior, we
  74.       have attempted to follow the spec. In cases where the spec. was 
  75.       ambiguous, we have attempted to match the Sun JDK 1.1.1 behavior.
  76.  
  77.     - A small number of changes were made to the JDK libraries to address
  78.       bugs which would have significant impact on the usability of the
  79.       system.
  80.  
  81.     - There are some known limitations which will be fixed in a later
  82.       release.
  83.  
  84. 2.2 package java.lang
  85.  
  86. 2.2.1 Math
  87.  
  88. The internal representation of all floating point values in VisualAge for 
  89. Java is double (i.e. 8 byte IEEE). This is a know limitation which will be 
  90. fixed in a later release.
  91.  
  92. 2.2.2 Threads
  93.  
  94. Please see Section 3.1
  95.  
  96. 2.2.3 Exceptions
  97.  
  98. The stack trace information which is provided by the 
  99. Throwable.printStackTrace(...) method will not match exactly the output 
  100. from a Sun VM's stack trace. This reflects the differing underlying 
  101. implementations, and is not a defect.
  102.  
  103. When an uncaught exception causes the debugger to open, only the stack 
  104. between the last place where the exception was caught (for example, by a 
  105. "synchronize (...) { ... }" statement) and the root of the stack trace will
  106. be visible. This is technically correct, but less than optimal from a 
  107. debugging standpoint. The best strategy is to breakpoint the method causing
  108. the problem and manual step through the offending code.
  109.  
  110. The ThreadDeath exception does not provide interesting stack trace 
  111. information.
  112.  
  113. 2.2.4 ClassLoader
  114.  
  115. The ClassLoaders included with VisualAge for Java are constructed in such 
  116. a way that they respect the rules of the development environment concerning
  117. how classes are brought into the workspace and code repository. This leads
  118. to the following restrictions:
  119.  
  120. All pre-defined types which VisualAge for Java deals with must exist in the
  121. repository as well as the workspace.  Any call to the default loadClass(...)
  122. methods in ClassLoader, or Class.forName(...) will throw a 
  123. ClassNotFoundException if the type is not already loaded in the workspace. 
  124.  
  125. If a class is dynamically constructed (i.e. via defineClass(...)), then it
  126. is both created in the repository and loaded into the workspace. All 
  127. dynamically loaded class are created in their respective packages in an 
  128. automatically generated project named 'Uvm dynamically loaded classes'. 
  129. In addition, it is not possible to use defineClass(...) to *redefine* an 
  130. existing class in the workspace, and finally, all classes which are 
  131. referred to by the class being constructed must exist in the workspace, 
  132. or Problems will occur (i.e. they will show up on the "Unresolved Problems" 
  133. page of the Workbench).
  134.  
  135. 2.3 package java.awt
  136.  
  137. 2.3.1 Widgets
  138.  
  139. The following are the known limitations and omissions in the AWT widget 
  140. peer classes as provided by the VisualAge for Java R1.0 class libraries.
  141. Typically, these represent problems which will be fixed in a subsequent 
  142. release. In a small number of cases they simply describe platform behavior 
  143. which application programmers should be aware of.
  144.  
  145. * 1.0.2 Events
  146.     Returning false from handleEvent() (Sun JDK 1.0.2 style events)
  147.     is not guaranteed to stop event processing by the operating system.
  148.  
  149. * Sun JDK 1.1.1 API missing features
  150.     All API for the Java AWT peer interfaces are implemented, with the 
  151.     exception of the following two: 
  152.  
  153.         OS/2
  154.             i) java.awt.peer.ComponentPeer
  155.                 print(java.awt.Graphics)
  156.         ALL Platforms.
  157.             ii) java.awt.peer.FileDialogPeer
  158.                 setFilenameFilter(java.io.FilenameFilter)
  159.  
  160. * Color limitation (Windows 95/NT only)
  161.     When running the VisualAge IDE on Windows in 256 color mode it is 
  162.     possible that widgets will not be drawn using the exact color that was 
  163.     requested. On Windows, in 256 color mode, only the 20 system colors are
  164.     used by the operating system to draw the background and foreground of 
  165.     widgets. 
  166.  
  167.     Possible workarounds: 
  168.         1) Use 16-bit color mode.
  169.  
  170. * Color limitation (OS/2 only)
  171.     On OS/2 Warp 4 in 256 color mode when running Netscape 2.2 
  172.     simultaneously with the VisualAge IDE, the IDE is unable to get all 
  173.     the colors needed to draw widgets and graphics.
  174.  
  175.     Possible workarounds: 
  176.         1) Disable palette awareness in Netscape.  (i.e. Unchecking the 
  177.            palette aware option on the General Preferences Color page.)
  178.         2) Use 16-bit color mode.
  179.         3) Do not run Netscape when using the IDE in 256 color mode.
  180.  
  181. * Button has extra border (OS/2 only)
  182.     Buttons have an extra border around them which is drawn in black when
  183.     they are selected, and in the background color when they are not.  This
  184.     can give the appearances of extra space during layout relative to the
  185.     appearance on other platforms, but is not a bug.
  186.  
  187. * Cursors in lightweight components (OS2 only)
  188.     If the cursor is inside a lightweight component and the cursor type for 
  189.     this component is changed, it will not be updated until the mouse 
  190.     pointer is moved out of the component and back in.
  191.  
  192. * Fonts in menus
  193.     Setting fonts in menus (using MenuComponent.setFont(...)) will not 
  194.     change the font.
  195.  
  196. * Paint and Update events
  197.     Paint and Update events are sent right after showing a window.
  198.     Application code which sends show() or setVisible() to a window before 
  199.     ensuring that all initialization required to handle the paint() and 
  200.     update() methods is complete may be unprepared for the first paint or 
  201.     update call. For example, code like the following which needs 
  202.     paintColor to be non-nil in the paint() method may fail.
  203.  
  204.         MyFrame mf = new MyFrame("Not Initialized");
  205.         mf.show();
  206.         // paint method uses paintColor to draw things
  207.         // but initializes it after sending show() (*wrong!*)
  208.         Color paintColor = Color.red;
  209.  
  210. * Text events
  211.     Text events do not allow character modification to be reflected in 
  212.     the text widget. In the JDK 1.1.1 keyChars can be changed in a key 
  213.     event (like KeyPressed), and this is reflected in the text widget.
  214.     We do not currently support this.
  215.  
  216. * Scrollpane scrollbars lurch
  217.     Clicking on a scroll bar within the scrollpane to page up or down can 
  218.     cause the scroll bar to jump once after the block increment is set.  
  219.  
  220. * Widget positioning without a layout manager
  221.     When you create a widget as a child of a shell with no layout manager
  222.     the x,y of the widget is relative to the top left of the shell in 
  223.     Sun JDK 1.1.1. This means you actually can place widgets under the 
  224.     title bar.  In VisualAge (0,0) is considered the top left corner of 
  225.     the client area of the shell.  If there is a menu it would be right
  226.     below the menu bar.  If there is no menu it would be below the title 
  227.     bar.
  228.  
  229. * FileDialog save (Windows 95, NT only)
  230.     FileDialog does not prompt to overwrite files by default. When opening 
  231.     a FileDialog for saving a file, the VisualAge AWT file dialog does 
  232.     prompt the user if they want to overwrite an existing file of the 
  233.     same name.
  234.  
  235. * Initial Frame sizes
  236.     When the width and height are not specified for Frames in VisualAge 
  237.     for Java they will not open so small that widgets are not visible.  
  238.     They pick a minimum size which makes widgets visible in the Frame.
  239.  
  240. * Clipboard lost ownership notifications
  241.     Clipboard owners are notified via #lostOwnership() when the 
  242.     clipboard contents change.
  243.  
  244. * Unicode support
  245.     Unicode characters (and Character to Byte conversion) are not 
  246.     supported.
  247.  
  248. 2.3.2 Graphics
  249.  
  250. The following are the known limitations and omissions in the AWT graphics
  251. support as provided by the VisualAge for Java R1.0 class libraries. 
  252. Typically, these represent problems which will be fixed in a subsequent 
  253. release. In a small number of cases they simply describe platform behavior 
  254. which application programmers should be aware of.
  255.  
  256. * Printing is not supported
  257.     This affects the following APIs:
  258.     - java.awt.Toolkit.getPrintJob(Frame, String, Properties);
  259.     - java.awt.Component.print(Graphics);
  260.     - java.awt.Component.printAll(Graphics);
  261.     - java.awt.PrintJob class
  262.     - java.awt.PrintGraphics interface
  263.  
  264. * Unicode characters are not supported
  265.     Only ASCII characters draw reliably using the 
  266.     java.awt.Graphics.drawString(...) method.
  267.  
  268. * No support for PM Palette Manager (OS/2 only)
  269.     Using the PM Palette Manager can cause other applications to display 
  270.     with incorrect colors. Applications which do use the PM Palette 
  271.     Manager, such as Netscape, can cause VisualAge for Java to draw with 
  272.     incorrect colors. We recommend disabling the 'Palette Aware' option 
  273.     of Netscape, located on the Colors page of the Options / General 
  274.     Preferences dialog.
  275.  
  276. * java.awt.Graphics.drawString(...) truncates at the first null character
  277.     All characters in the string after and including the null character
  278.     will not be displayed.
  279.  
  280. * Image dithering quality (OS/2 only)
  281.     Image dithering has lower quality on OS/2 WARP than on Windows.  This 
  282.     is due to the limitation on the number of colours available in 256 
  283.     colour mode on OS/2 WARP when not using the PM Palette Manager. In 
  284.     addition, ordered dithering of images produces images that are too 
  285.     light in the OS/2 WARP implementation. Ordered dithering is only used
  286.     when an ImageProducer sends data in random (i.e. not in top-down, 
  287.     left-right) order.  This latter problem does not appear when loading 
  288.     .GIF and .JPEG files.
  289.  
  290. * Font names lowercased
  291.     Font names returned by java.awt.Toolkit.getFontList() are in lower 
  292.     case. This is correct behavior because they appear as lower case in 
  293.     the resource file named 'font.properties'. Sun's VM returns mixed 
  294.     case names because they have hardcoded font names and do not use the 
  295.     font.properties resources.
  296.  
  297. * Arc/oval dimensions
  298.     Arcs and ovals draw one pixel too large in some situations.  This is 
  299.     more likely when the dimensions are even.  
  300.  
  301. 2.4 package java.io
  302.  
  303. The following are the known limitations and omissions in the java.io 
  304. package as provided by the VisualAge for Java R1.0 class libraries. 
  305. Typically, these represent problems which will be fixed in a subsequent 
  306. release. In a small number of cases they simply describe platform behavior 
  307. which application programmers should be aware of.
  308.  
  309. * isDirectory for paths ending in '\' (OS/2 only)
  310.     OS/2 java.io.File>>#isDirectory() answers false for paths ending 
  311.     with a slash character.
  312.  
  313. * absolute path length limitations
  314.     The maximum file or directory name length is 254 characters.
  315.     The maximum path length is 259 characters.
  316.     Note that these are operating system limitations on Win95 (VFAT/FAT32),
  317.     OS/2 (HPFS), and NT (NTFS). 
  318.  
  319. 2.5 package java.applet
  320.  
  321. 2.5.1 Sound support
  322.  
  323. When an audio clip is being played it may take as much as one second 
  324. to stop after a stop request is processed on OS2 only. The same delay will 
  325. occur when a second clip is started if an audio clip is already being 
  326. played.
  327.  
  328. 2.5.2 Applet security
  329.  
  330. Applets are always run from within the environment with an AppletSecurity
  331. manager active. By default this security manager will provide only very
  332. restrictive network access. This access can be changed using the
  333. AppletViewer properties menu.
  334.  
  335. 2.6 package java.util
  336.  
  337. 2.6.1 Locale support
  338.  
  339. VisualAge for Java R1.0 provides full support only for the english US locale.
  340. Because of this, the locale setting is preset to en_US whenever a program
  341. (applet or main) is started. However, there is partial support for several
  342. other single-byte locales. It is possible to set the local which your program
  343. runs in after it starts using the Local.setDefault(...) method, so for
  344. example, displaying the result of executing the following statements in 
  345. the Scrapbook:
  346.  
  347.     java.util.Locale.setDefault(java.util.Locale.ITALIAN);
  348.     new java.util.Date().toLocaleString()
  349.  
  350. will return something of the form:
  351.  
  352.   (java.lang.String) 30-giu-97 10.55.59
  353.  
  354. 2.7 package sun.jdbc.odbc
  355.  
  356. The following are the known limitations and omissions in the sun.jdbc.odbc 
  357. package as provided by the VisualAge for Java R1.0 class libraries. 
  358.  
  359. * OS/2 JDBC-ODBC Bridge
  360.     At the time of product availability, the Bridge was not included 
  361.     in the 1.1.1 OS/2 JDK.   JDBC data access via OS/2 ODBC drivers is 
  362.     not supported in the VAJava for OS/2 development environment.
  363.  
  364. * Stored Procedures
  365.     While the full JDBC API is fully preserved, access to Stored Procedures 
  366.     via the JDBC-ODBC bridge is not supported in the development 
  367.     environment. Calling Stored Procedures via the bridge will result in an
  368.     internal Java exception thrown at execution-time, to prevent further 
  369.     program execution.
  370.  
  371. 2.8 package sun.tools.jar
  372.  
  373. Running the jar utility from the IDE does not convert wildcard arguments
  374. as in the following:
  375.  
  376.     jar cvf test.jar *.class
  377.  
  378. This is correct behavior -- in the Sun implementation it is the JAR.EXE 
  379. file which provides wildcarding, not the Java code. 
  380.  
  381. Under OS/2, the jar utility does not support specifying arguments such as
  382.  
  383.     jar cvf test.jar .
  384.  
  385.  
  386. 3.0 Program Execution
  387.  
  388. Warning: The aspects of the execution environment described in this
  389. section may change in future releases.  Therefore, you should avoid
  390. implementing code that relies on the behavior described here.
  391.  
  392. 3.1 Java threads
  393.  
  394. Java threads are not implemented as OS threads. Roughly speaking, the
  395. whole environment runs as a single OS thread, and Java threads are
  396. implemented in software by the environment itself. Threads are scheduled
  397. based on time slices of approximately 250 milliseconds. You cannot change
  398. this value.
  399.  
  400. Although priorities of Java threads can be changed by the API
  401. available in java.lang.Thread, internally they are scheduled as
  402. though they all have the same priority. The IDE itself also runs as a
  403. thread (which is not visible to application code), but at a higher
  404. priority.  This causes the other threads to "freeze" when IDE
  405. operations are being performed.
  406.  
  407. This approach allows the UI to be more responsive to user actions.
  408. However, it also means that if the UI blocks for some reason (and it can),
  409. the environment feels as though it has hung. Typical actions that cause
  410. this are waiting on OS blocking calls or blocking on monitors (i.e.,
  411. synchronized methods). Therefore, Java code that is run from within the
  412. UI thread can potentially lock the environment. Typically, this does not
  413. happen, but it can occur when evaluating synchronized methods from the
  414. debugger and during certain operations performed by the composition
  415. editor. An attempt is made to detect the case where the UI will lock and
  416. warn the user.
  417.  
  418. 3.1.2 Terminating threads in the Debugger
  419.  
  420. Caution should be used when terminating threads in the debugger.
  421. The standard AWT event dispatch thread for the IDE shows up in
  422. the list of available threads, and if it is terminated, AWT widgets
  423. which are visible in builder windows may fail to display properly. If
  424. this situation arises, exit the environment (saving your workspace
  425. is OK) and restart it.
  426.  
  427. 3.2 Simulating multiple virtual machines
  428.  
  429. The Scrapbook can have multiple pages, each of which behaves like a
  430. completely separate Java program running in its own virtual machine.
  431. Code that is run in one page has no side-effects on code running in other
  432. pages. Therefore, if you have client/server programs for example, and you
  433. want to test them in the same machine, there is no need to start two
  434. separate environments. All you need to do is open a page in the Scrapbook
  435. and type in code to launch your server. Then go to another page and type
  436. the code to launch your client code. They behave just as they were
  437. launched from two separate virtual machines.
  438.  
  439. Here is a simpler example. If you have class X with static slot y, and
  440. it is initialized with null as shown below:
  441.  
  442.    public static y = null;
  443.  
  444. and you go to one new page of the Scrapbook and run:
  445.  
  446.    X.y = "abc"; uvm.tools.DebugSupport.inspect (X.y);
  447.  
  448. you get an Inspector showing:
  449.  
  450.    "abc"
  451.  
  452. Now go to another new page of the Scrapbook and run:
  453.  
  454.    uvm.tools.DebugSupport.inspect (X.y);
  455.  
  456. In this Inspector the value of y is still null.
  457.  
  458. Note, however, that if you add, modify, or delete methods or classes, the
  459. changes are global to the environment. That is, any changes in the code
  460. either in methods, or the shape of the classes, is immediately visible in
  461. all Scrapbook pages where these classes are used (and in all associated
  462. inspectors, debuggers, and so on).
  463.  
  464. As you would expect, code which is run from the Run -> In Applet
  465. Viewer... and Run -> Run Main... menu items also behaves like a
  466. completely separate Java program running in its own virtual machine.
  467.  
  468. 3.2 Object mutation
  469.  
  470. The fact that the Scrapbook maintains the objects created and still 
  471. referenced by code run in each page raises the issue of what happens to
  472. the existing instances when classes are modified. Typical cases of 
  473. this kind of change are:
  474.  
  475.    - Add a new instance variable (instance slot).
  476.    - Add a new static slot.
  477.    - Delete an instance variable.
  478.    - Delete a static slot.
  479.    - Change the definition of an instance variable (change its type, 
  480.      for example).
  481.    - Change the definition of static slot. 
  482.  
  483. In VisualAge for Java, when a class definition changes for some reason, 
  484. all existing instances are *mutated* into instances that conform to the 
  485. new definition. The behavior of the mutation code is as follows:
  486.  
  487.    - Unchanged slots from the old instance have the same value in the 
  488.      new instance.
  489.    - New (non-static) slots are null, 0, 0.0, or false based on the type 
  490.      (Object, integer valued, float valued, boolean valued respectively).
  491.      This means that they do not have their initialized value declared by
  492.      the class, since the initialization code is not run when mutation is
  493.      performed.
  494.    - Deleted slots do not exist in the new instances. 
  495.  
  496. 3.3 Object finalization
  497.  
  498. Objects that are no longer referenced may be finalized if they implement 
  499. the finalize() method. However, it is important to note that nothing 
  500. prevents users from writing finalizers that can, potentially, loop
  501. forever. For instance, a finalizer can be implemented to do
  502.  
  503.     while (true) {};
  504.  
  505. This would make the finalizer thread loop forever,
  506. being unable to finalize any other objects.
  507.  
  508. Another obvious case is deadlock, where a finalizer attempts to call a
  509. synchronized method, but there is already a different thread in the 
  510. monitor associated with the object, in which case the finalizer will 
  511. have to wait until the monitor is released. If the monitor is never 
  512. released due to program bugs, the finalizer will also block forever.
  513.  
  514. Programs can also generate garbage at a high rate, in which case
  515. the finalizers have to be run more often. Running finalizers is
  516. very important in an integrated environment like IDE, since
  517. it can host multiple programs running (for instance, multiple
  518. applets, or multiple pages in the Scrapbook), simulating multiple
  519. virtual machines as described in section 3.2.
  520.  
  521. Not running finalizers could mean leaking OS resources, and that
  522. is why IDE is careful about finalizing as much as possible.
  523.  
  524. In order to cope with the constraints above, there are actually
  525. two possibilities when finalizers can be run. Whenever the IDE
  526. is idle (no user events, no Java threads running) an internal,
  527. very low priority thread is launched to execute the finalizers.
  528. If this thread is blocked forever and the machine becomes idle
  529. again, a new finalizer thread is launched. After running each
  530. finalizer they detect if there are more than one low priority
  531. finalizer threads, and terminate themselves to bring the state
  532. back to having only one low-priority finalizer. At system startup
  533. there will be only one finalizer thread running, even if the Workspace
  534. was saved in a state with multiple, blocked finalizers.
  535.  
  536. However a low priority thread running finalizers is not good enough.
  537. For those applications that generate exceptional amounts of garbage, a 
  538. more aggressive finalization strategy is required. At runtime, if the
  539. system detects that there are too many objects that need to be
  540. finalized, a high priority finalizer thread starts right away. While
  541. this thread runs, no other Java threads can run (unless the high
  542. priority finalizer blocks, etc). In cases where finalization
  543. loops forever or blocks, instead of launching more high-priority
  544. threads, the execution of each finalizer is bounded by a timeout.
  545. If it takes too long to run, the thread is terminated (therefore
  546. releasing monitors it might have acquired) and the system goes back
  547. to its initial state. If it detects that more finalization has to run
  548. immediately, the cycle is repeated. Note that this strategy means that
  549. if an application generates garbage intensively and the finalizers take
  550. too long to run they will not run to completion. Currently
  551. the timout value is set at 5 seconds and cannot be changed by the user.
  552.  
  553. In normal conditions the low priority thread should be enough
  554. to run finalizers. When too much garbage is generated, the
  555. high priority thread may be run to finalize objects at a higher
  556. rate.
  557.  
  558. In cases where finalizers cause deadlocks in the low priority
  559. thread you may end up having multiple instances of them blocked,
  560. trying to perform finalization (which in this case have no timeout).
  561. There is no mechanism to verify how many of these low priority
  562. finalizers are running/blocked. If you want to make sure you
  563. have only one, you can exit and run the IDE again. As said before,
  564. on startup there will be only one.
  565.  
  566. 3.4 JNI
  567.  
  568. 3.4.1 Unsupported JNI API
  569.  
  570. The following JNI API methods are not implemented. Calling any of these 
  571. will result in a NoSuchMethodError exception.
  572.  
  573.     DefineClass
  574.     ExceptionDescribe
  575.     FatalError
  576.     RegisterNatives
  577.     UnregisterNatives
  578.     MonitorEnter
  579.     MonitorExit
  580.     GetJavaVM
  581.  
  582. This is a known limitation in R1.0 of VisualAge for Java which will be 
  583. fixed in a subsequent release.
  584.  
  585. 3.4.2 JNI on OS/2
  586.  
  587. JNI on OS/2 requires IBM VisualAge C++ for OS/2, Version 3 CSD level CTC306
  588. or later.
  589.  
  590. The following system error, which prematurely terminates the IDE, may occur
  591. with prior CSD levels of the C compiler when a JNI native C implementation 
  592. contains a printf() and console output is not redirected (i.e. IDE > trace).
  593.  
  594.     OS/2 - SYS-147
  595.     Not enough resources are available to process this command.
  596.     The process for which this pop-up is displayed will end.
  597.