Name | Date | Size | ||
---|---|---|---|---|
.. | 12-Dec-2017 | 4 | ||
alloc.h | H A D | 12-Dec-2017 | 7.4 KiB | |
awt.h | H A D | 12-Dec-2017 | 13.8 KiB | |
awt.rc | H A D | 12-Dec-2017 | 2.9 KiB | |
awt_AWTEvent.cpp | H A D | 12-Dec-2017 | 3.6 KiB | |
awt_AWTEvent.h | H A D | 12-Dec-2017 | 1.7 KiB | |
awt_BitmapUtil.cpp | H A D | 12-Dec-2017 | 11.9 KiB | |
awt_BitmapUtil.h | H A D | 12-Dec-2017 | 3.1 KiB | |
awt_Brush.cpp | H A D | 12-Dec-2017 | 2.7 KiB | |
awt_Brush.h | H A D | 12-Dec-2017 | 2.1 KiB | |
awt_Button.cpp | H A D | 12-Dec-2017 | 11.3 KiB | |
awt_Button.h | H A D | 12-Dec-2017 | 2.3 KiB | |
awt_Canvas.cpp | H A D | 12-Dec-2017 | 8.4 KiB | |
awt_Canvas.h | H A D | 12-Dec-2017 | 1.9 KiB | |
awt_Checkbox.cpp | H A D | 12-Dec-2017 | 18.6 KiB | |
awt_Checkbox.h | H A D | 12-Dec-2017 | 2.8 KiB | |
awt_Choice.cpp | H A D | 12-Dec-2017 | 26 KiB | |
awt_Choice.h | H A D | 12-Dec-2017 | 3.3 KiB | |
awt_Clipboard.cpp | H A D | 12-Dec-2017 | 15.2 KiB | |
awt_Clipboard.h | H A D | 12-Dec-2017 | 2.4 KiB | |
awt_Color.cpp | H A D | 12-Dec-2017 | 3.4 KiB | |
awt_Color.h | H A D | 12-Dec-2017 | 1.4 KiB | |
awt_Component.cpp | H A D | 12-Dec-2017 | 237.1 KiB | |
awt_Component.h | H A D | 12-Dec-2017 | 31.5 KiB | |
awt_Container.cpp | H A D | 12-Dec-2017 | 1.8 KiB | |
awt_Container.h | H A D | 12-Dec-2017 | 1.5 KiB | |
awt_Cursor.cpp | H A D | 12-Dec-2017 | 17.2 KiB | |
awt_Cursor.h | H A D | 12-Dec-2017 | 2.8 KiB | |
awt_CustomPaletteDef.h | H A D | 12-Dec-2017 | 10.9 KiB | |
awt_DataTransferer.cpp | H A D | 12-Dec-2017 | 30.7 KiB | |
awt_DataTransferer.h | H A D | 12-Dec-2017 | 11.1 KiB | |
awt_DCHolder.cpp | H A D | 12-Dec-2017 | 3.1 KiB | |
awt_DCHolder.h | H A D | 12-Dec-2017 | 2.1 KiB | |
awt_Debug.cpp | H A D | 12-Dec-2017 | 7.1 KiB | |
awt_Debug.h | H A D | 12-Dec-2017 | 3.6 KiB | |
awt_Desktop.cpp | H A D | 12-Dec-2017 | 5.5 KiB | |
awt_DesktopProperties.cpp | H A D | 12-Dec-2017 | 39.3 KiB | |
awt_DesktopProperties.h | H A D | 12-Dec-2017 | 3.2 KiB | |
awt_Dialog.cpp | H A D | 12-Dec-2017 | 25.7 KiB | |
awt_Dialog.h | H A D | 12-Dec-2017 | 5.1 KiB | |
awt_Dimension.cpp | H A D | 12-Dec-2017 | 1.9 KiB | |
awt_Dimension.h | H A D | 12-Dec-2017 | 1.5 KiB | |
awt_DnDDS.cpp | H A D | 12-Dec-2017 | 46.3 KiB | |
awt_DnDDS.h | H A D | 12-Dec-2017 | 9.7 KiB | |
awt_DnDDT.cpp | H A D | 12-Dec-2017 | 45.9 KiB | |
awt_DnDDT.h | H A D | 12-Dec-2017 | 8.7 KiB | |
awt_DrawingSurface.cpp | H A D | 12-Dec-2017 | 8 KiB | |
awt_DrawingSurface.h | H A D | 12-Dec-2017 | 5.4 KiB | |
awt_Event.cpp | H A D | 12-Dec-2017 | 2 KiB | |
awt_Event.h | H A D | 12-Dec-2017 | 1.5 KiB | |
awt_FileDialog.cpp | H A D | 12-Dec-2017 | 24 KiB | |
awt_FileDialog.h | H A D | 12-Dec-2017 | 2.5 KiB | |
awt_Font.cpp | H A D | 12-Dec-2017 | 55.2 KiB | |
awt_Font.h | H A D | 12-Dec-2017 | 9.4 KiB | |
awt_Frame.cpp | H A D | 12-Dec-2017 | 62.8 KiB | |
awt_Frame.h | H A D | 12-Dec-2017 | 7.8 KiB | |
awt_GDIObject.cpp | H A D | 12-Dec-2017 | 6.3 KiB | |
awt_GDIObject.h | H A D | 12-Dec-2017 | 3.5 KiB | |
awt_IconCursor.cpp | H A D | 12-Dec-2017 | 3.2 KiB | |
awt_IconCursor.h | H A D | 12-Dec-2017 | 1.5 KiB | |
awt_InputEvent.cpp | H A D | 12-Dec-2017 | 1.7 KiB | |
awt_InputEvent.h | H A D | 12-Dec-2017 | 1.5 KiB | |
awt_InputMethod.cpp | H A D | 12-Dec-2017 | 19.5 KiB | |
awt_InputTextInfor.cpp | H A D | 12-Dec-2017 | 14.9 KiB | |
awt_InputTextInfor.h | H A D | 12-Dec-2017 | 3.2 KiB | |
awt_Insets.cpp | H A D | 12-Dec-2017 | 2.2 KiB | |
awt_Insets.h | H A D | 12-Dec-2017 | 1.6 KiB | |
awt_KeyboardFocusManager.cpp | H A D | 12-Dec-2017 | 3.1 KiB | |
awt_KeyEvent.cpp | H A D | 12-Dec-2017 | 2.8 KiB | |
awt_KeyEvent.h | H A D | 12-Dec-2017 | 1.7 KiB | |
awt_Label.cpp | H A D | 12-Dec-2017 | 11.1 KiB | |
awt_Label.h | H A D | 12-Dec-2017 | 2.4 KiB | |
awt_List.cpp | H A D | 12-Dec-2017 | 27.7 KiB | |
awt_List.h | H A D | 12-Dec-2017 | 6.5 KiB | |
awt_Menu.cpp | H A D | 12-Dec-2017 | 12.5 KiB | |
awt_Menu.h | H A D | 12-Dec-2017 | 3.3 KiB | |
awt_MenuBar.cpp | H A D | 12-Dec-2017 | 9 KiB | |
awt_MenuBar.h | H A D | 12-Dec-2017 | 2.6 KiB | |
awt_MenuItem.cpp | H A D | 12-Dec-2017 | 33.1 KiB | |
awt_MenuItem.h | H A D | 12-Dec-2017 | 5.8 KiB | |
awt_Mlib.cpp | H A D | 12-Dec-2017 | 3.6 KiB | |
awt_Mlib.h | H A D | 12-Dec-2017 | 1.7 KiB | |
awt_MouseEvent.cpp | H A D | 12-Dec-2017 | 2.1 KiB | |
awt_MouseEvent.h | H A D | 12-Dec-2017 | 1.6 KiB | |
awt_new.cpp | H A D | 12-Dec-2017 | 7.1 KiB | |
awt_new.h | H A D | 12-Dec-2017 | 1.6 KiB | |
awt_Object.cpp | H A D | 12-Dec-2017 | 8.5 KiB | |
awt_Object.h | H A D | 12-Dec-2017 | 4.6 KiB | |
awt_ole.cpp | H A D | 12-Dec-2017 | 3.2 KiB | |
awt_ole.h | H A D | 12-Dec-2017 | 5.3 KiB | |
awt_Palette.cpp | H A D | 12-Dec-2017 | 11.4 KiB | |
awt_Palette.h | H A D | 12-Dec-2017 | 4.5 KiB | |
awt_Panel.cpp | H A D | 12-Dec-2017 | 1.8 KiB | |
awt_Panel.h | H A D | 12-Dec-2017 | 1.5 KiB | |
awt_Pen.cpp | H A D | 12-Dec-2017 | 2.7 KiB | |
awt_Pen.h | H A D | 12-Dec-2017 | 2 KiB | |
awt_PopupMenu.cpp | H A D | 12-Dec-2017 | 9 KiB | |
awt_PopupMenu.h | H A D | 12-Dec-2017 | 2.3 KiB | |
awt_PrintControl.cpp | H A D | 12-Dec-2017 | 41.4 KiB | |
awt_PrintControl.h | H A D | 12-Dec-2017 | 5.1 KiB | |
awt_PrintDialog.cpp | H A D | 12-Dec-2017 | 10.5 KiB | |
awt_PrintDialog.h | H A D | 12-Dec-2017 | 1.8 KiB | |
awt_PrintJob.cpp | H A D | 12-Dec-2017 | 144.8 KiB | |
awt_Rectangle.cpp | H A D | 12-Dec-2017 | 2.3 KiB | |
awt_Rectangle.h | H A D | 12-Dec-2017 | 1.6 KiB | |
awt_Robot.cpp | H A D | 12-Dec-2017 | 14.2 KiB | |
awt_Robot.h | H A D | 12-Dec-2017 | 2 KiB | |
awt_Scrollbar.cpp | H A D | 12-Dec-2017 | 18.6 KiB | |
awt_Scrollbar.h | H A D | 12-Dec-2017 | 3.6 KiB | |
awt_ScrollPane.cpp | H A D | 12-Dec-2017 | 24 KiB | |
awt_ScrollPane.h | H A D | 12-Dec-2017 | 3.2 KiB | |
awt_Taskbar.cpp | H A D | 12-Dec-2017 | 4.2 KiB | |
awt_Taskbar.h | H A D | 12-Dec-2017 | 4.2 KiB | |
awt_TextArea.cpp | H A D | 12-Dec-2017 | 16.5 KiB | |
awt_TextArea.h | H A D | 12-Dec-2017 | 2.6 KiB | |
awt_TextComponent.cpp | H A D | 12-Dec-2017 | 35.8 KiB | |
awt_TextComponent.h | H A D | 12-Dec-2017 | 6.7 KiB | |
awt_TextField.cpp | H A D | 12-Dec-2017 | 9.1 KiB | |
awt_TextField.h | H A D | 12-Dec-2017 | 2 KiB | |
awt_Toolkit.cpp | H A D | 12-Dec-2017 | 84.3 KiB | |
awt_Toolkit.h | H A D | 12-Dec-2017 | 21.7 KiB | |
awt_TrayIcon.cpp | H A D | 12-Dec-2017 | 32.5 KiB | |
awt_TrayIcon.h | H A D | 12-Dec-2017 | 5.2 KiB | |
awt_Win32GraphicsConfig.cpp | H A D | 12-Dec-2017 | 4.2 KiB | |
awt_Win32GraphicsConfig.h | H A D | 12-Dec-2017 | 1.4 KiB | |
awt_Win32GraphicsDevice.cpp | H A D | 12-Dec-2017 | 45.5 KiB | |
awt_Win32GraphicsDevice.h | H A D | 12-Dec-2017 | 5.6 KiB | |
awt_Win32GraphicsEnv.cpp | H A D | 12-Dec-2017 | 10.4 KiB | |
awt_Window.cpp | H A D | 12-Dec-2017 | 113.5 KiB | |
awt_Window.h | H A D | 12-Dec-2017 | 14.8 KiB | |
awtmsg.h | H A D | 12-Dec-2017 | 7.2 KiB | |
check.bmp | H A D | 12-Dec-2017 | 166 | |
CmdIDList.cpp | H A D | 12-Dec-2017 | 4 KiB | |
CmdIDList.h | H A D | 12-Dec-2017 | 2.1 KiB | |
colordata.h | H A D | 12-Dec-2017 | 1.5 KiB | |
ComCtl32Util.cpp | H A D | 12-Dec-2017 | 3.2 KiB | |
ComCtl32Util.h | H A D | 12-Dec-2017 | 2.4 KiB | |
Devices.cpp | H A D | 12-Dec-2017 | 13.4 KiB | |
Devices.h | H A D | 12-Dec-2017 | 2.7 KiB | |
DllUtil.cpp | H A D | 12-Dec-2017 | 2.6 KiB | |
DllUtil.h | H A D | 12-Dec-2017 | 3.2 KiB | |
GDIHashtable.cpp | H A D | 12-Dec-2017 | 4 KiB | |
GDIHashtable.h | H A D | 12-Dec-2017 | 7.2 KiB | |
Hashtable.cpp | H A D | 12-Dec-2017 | 6.3 KiB | |
Hashtable.h | H A D | 12-Dec-2017 | 4.7 KiB | |
img_util_md.h | H A D | 12-Dec-2017 | 3.9 KiB | |
initIDs.cpp | H A D | 12-Dec-2017 | 2.3 KiB | |
mlib_types_md.h | H A D | 12-Dec-2017 | 1.3 KiB | |
MouseInfo.cpp | H A D | 12-Dec-2017 | 3.9 KiB | |
ObjectList.cpp | H A D | 12-Dec-2017 | 3.6 KiB | |
ObjectList.h | H A D | 12-Dec-2017 | 1.8 KiB | |
README.JNI | H A D | 12-Dec-2017 | 4.5 KiB | |
security_warning.ico | H A D | 12-Dec-2017 | 17.1 KiB | |
security_warning_bw.ico | H A D | 12-Dec-2017 | 17.1 KiB | |
security_warning_int.ico | H A D | 12-Dec-2017 | 17.1 KiB | |
ShellFolder2.cpp | H A D | 12-Dec-2017 | 50.4 KiB | |
stdhdrs.h | H A D | 12-Dec-2017 | 1.8 KiB | |
ThemeReader.cpp | H A D | 12-Dec-2017 | 29 KiB | |
WPrinterJob.cpp | H A D | 12-Dec-2017 | 35.5 KiB |
README.JNI
1[sl@eng 97/07/24] 2 3All the free-standing functions (those that are not JNI native 4methods) must not leak local references. Local references are 5automatically freed when the native method returns to Java. However, 6the free-standing functions are called from the event loop that never 7returns to Java. If these functions do not clean up the local 8references they create, the Java objects corresponding to the local 9references will never be garbage collected. 10 11This is caused by the fact that JNI does not clean up local refs 12until control returns to Java. However, this problem is somewhat 13unique to AWT code because AWT code has long-running native methods 14that never return. 15 16Local refs may be cleaned up manually *before* control returns to 17Java in one of the following two ways: 18 191. Use EnsureLocalCapacity at the beginning of the function to make 20sure the VM has enough memory to create the number of JNI local refs 21needed in the function. Use DeleteLocalRef to clean up any local ref 22created inside the function that are not returned as the result. For 23example: 24 25 void AwtComponent::MeasureListItem(JNIEnv *env, 26 MEASUREITEMSTRUCT far& measureInfo) 27 { 28 if (env->EnsureLocalCapacity(1) < 0) { 29 return; 30 } 31 jobject dimension = PreferredItemSize(env); 32 33 ... /* Use dimension */ 34 35 env->DeleteLocalRef(dimension); 36 } 37 382. Use PushLocalFrame and PopLocalFrame to start a new local reference 39frame. All the local refs created in the new frame will be automatically 40freed when PopLocalFrame is called. For example, the above function can be 41rewritten as follows: 42 43 void AwtComponent::MeasureListItem(JNIEnv *env, 44 MEASUREITEMSTRUCT far& measureInfo) 45 { 46 if (env->PushLocalFrame(1) < 0) { 47 return; 48 } 49 jobject dimension = PreferredItemSize(env); 50 51 ... /* Use dimension */ 52 53 env->PopLocalFrame(NULL); 54 } 55 56The second approach is easier to use when there are multiple local refs 57to manage. The first approach is more efficient when the function only 58needs to create a small number (3 or less) of local refs. 59 60Pay special attention to local refs created inside a loop. They must be 61deleted after every iteration, otherwise they accumulate very quickly: 62 63int AwtFont::getFontDescriptorNumber(JNIEnv *env, jobject font, 64 jobject fontDescriptor) 65{ 66 ... /* other stuff */ 67 68 jarray array = ... 69 70 for (i = 0; i < num; i++){ 71 refFontDescriptor = env->GetObjectArrayElement(array, i); 72 if (env->IsSameObject(refFontDescriptor, fontDescriptor)) { 73 env->DeleteLocalRef(refFontDescriptor); 74 env->DeleteLocalRef(array); 75 return i; 76 } 77 env->DeleteLocalRef(refFontDescriptor); 78 } 79 env->DeleteLocalRef(array); 80 return 0; // Not found. Use default. 81} 82 83Note that we must make sure the local refs are cleaned up at every possible 84return branch. To reduce code duplication, many AWT functions use "goto" 85to jump to a common set of cleanup statements. 86 87Even if we use PushLocalFrame, we must still delete the local refs created 88in the loop: 89 90 if (env->PushLocalFrame(2) < 0) 91 return 0; 92 jarray array = ... 93 for (i = 0; i < num; i++){ 94 refFontDescriptor = env->GetObjectArrayElement(array, i); 95 if (env->IsSameObject(refFontDescriptor, fontDescriptor)) { 96 env->PopLocalFrame(NULL); 97 return i; 98 } 99 env->DeleteLocalRef(refFontDescriptor); 100 } 101 env->PopLocalFrame(NULL); 102 return 0; // Not found. Use default. 103 104unless we ensure that we have space for all possible local refs we are 105going to create inside the loop (note the different argument passed 106to PushLocalFrame): 107 108// Maximum number of local refs we can create in this code segment is 109// num + 1. 110 if (env->PushLocalFrame(num + 1) < 0) 111 return 0; 112 jarray array = ... 113 for (i = 0; i < num; i++){ 114 refFontDescriptor = env->GetObjectArrayElement(array, i); 115 if (env->IsSameObject(refFontDescriptor, fontDescriptor)) { 116 env->PopLocalFrame(NULL); 117 return i; 118 } 119// no longer necessary. env->DeleteLocalRef(refFontDescriptor); 120 } 121 env->PopLocalFrame(NULL); 122 return 0; // Not found. Use default. 123 124THINGS TO DO: 125 126 1. Investigate another possibility of dealing with local refs. Instead 127 of making sure every free-standing function does not leak local refs, 128 we could alternatively create a new local ref frame for each invocation 129 of callback functions. All local refs created during the execution of 130 the callback will then be automatically freed. 131 132 2. Handle exceptions properly. The current code lacks error checking 133 and recovery. This leads to random runtime crashes. 134