< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/CPrinterJob.m

Print this page
rev 54094 : 8257853: Remove dependencies on JNF's JNI utility functions in AWT and 2D code
rev 54095 : 8259343: [macOS] Update JNI error handling in Cocoa code.
rev 54096 : 8259651: [macOS] Replace JNF_COCOA_ENTER/EXIT macros
rev 54098 : 8260616: Removing remaining JNF dependencies in the java.desktop module
8259729: Missed JNFInstanceOf -> IsInstanceOf conversion
rev 54100 : 8259232: Bad JNI lookup during printing
Reviewed-by: psadhukhan

@@ -28,23 +28,38 @@
 #import "java_awt_print_Pageable.h"
 #import "sun_lwawt_macosx_CPrinterJob.h"
 #import "sun_lwawt_macosx_CPrinterPageDialog.h"
 
 #import <Cocoa/Cocoa.h>
-#import <JavaNativeFoundation/JavaNativeFoundation.h>
 
 #import "PrinterView.h"
 #import "PrintModel.h"
 #import "ThreadUtilities.h"
 #import "GeomUtilities.h"
+#import "JNIUtilities.h"
 
-static JNF_CLASS_CACHE(sjc_Paper, "java/awt/print/Paper");
-static JNF_CLASS_CACHE(sjc_PageFormat, "java/awt/print/PageFormat");
-static JNF_CLASS_CACHE(sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob");
-static JNF_CLASS_CACHE(sjc_CPrinterDialog, "sun/lwawt/macosx/CPrinterDialog");
-static JNF_MEMBER_CACHE(sjm_getNSPrintInfo, sjc_CPrinterJob, "getNSPrintInfo", "()J");
-static JNF_MEMBER_CACHE(sjm_printerJob, sjc_CPrinterDialog, "fPrinterJob", "Lsun/lwawt/macosx/CPrinterJob;");
+static jclass sjc_Paper = NULL;
+static jclass sjc_PageFormat = NULL;
+static jclass sjc_CPrinterJob = NULL;
+static jclass sjc_CPrinterDialog = NULL;
+static jmethodID sjm_getNSPrintInfo = NULL;
+static jmethodID sjm_printerJob = NULL;
+
+#define GET_PAPER_CLASS() GET_CLASS(sjc_Paper, "java/awt/print/Paper");
+#define GET_PAGEFORMAT_CLASS() GET_CLASS(sjc_PageFormat, "java/awt/print/PageFormat");
+#define GET_CPRINTERDIALOG_CLASS() GET_CLASS(sjc_CPrinterDialog, "sun/lwawt/macosx/CPrinterDialog");
+#define GET_CPRINTERDIALOG_CLASS_RETURN(ret) GET_CLASS_RETURN(sjc_CPrinterDialog, "sun/lwawt/macosx/CPrinterDialog", ret);
+#define GET_CPRINTERJOB_CLASS() GET_CLASS(sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob");
+#define GET_CPRINTERJOB_CLASS_RETURN(ret) GET_CLASS_RETURN(sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob", ret);
+
+#define GET_NSPRINTINFO_METHOD_RETURN(ret) \
+    GET_CPRINTERJOB_CLASS_RETURN(ret); \
+    GET_METHOD_RETURN(sjm_getNSPrintInfo, sjc_CPrinterJob, "getNSPrintInfo", "()J", ret);
+
+#define GET_CPRINTERDIALOG_FIELD_RETURN(ret) \
+   GET_CPRINTERDIALOG_CLASS_RETURN(ret); \
+   GET_FIELD_RETURN(sjm_printerJob, sjc_CPrinterDialog, "fPrinterJob", "Lsun/lwawt/macosx/CPrinterJob;", ret);
 
 static NSPrintInfo* createDefaultNSPrintInfo();
 
 static void makeBestFit(NSPrintInfo* src);
 

@@ -69,11 +84,11 @@
 static NSPrintInfo* createDefaultNSPrintInfo(JNIEnv* env, jstring printer)
 {
     NSPrintInfo* defaultPrintInfo = [[NSPrintInfo sharedPrintInfo] copy];
     if (printer != NULL)
     {
-        NSPrinter* nsPrinter = [NSPrinter printerWithName:JNFJavaToNSString(env, printer)];
+        NSPrinter* nsPrinter = [NSPrinter printerWithName:JavaStringToNSString(env, printer)];
         if (nsPrinter != nil)
         {
             [defaultPrintInfo setPrinter:nsPrinter];
         }
     }

@@ -138,12 +153,14 @@
 // In java printing, the rectangle is oriented if accessed from PageFormat. It is
 //  not oriented when accessed from Paper.
 
 static void nsPrintInfoToJavaPaper(JNIEnv* env, NSPrintInfo* src, jobject dst)
 {
-    static JNF_MEMBER_CACHE(jm_setSize, sjc_Paper, "setSize", "(DD)V");
-    static JNF_MEMBER_CACHE(jm_setImageableArea, sjc_Paper, "setImageableArea", "(DDDD)V");
+    GET_PAGEFORMAT_CLASS();
+    GET_PAPER_CLASS();
+    DECLARE_METHOD(jm_setSize, sjc_Paper, "setSize", "(DD)V");
+    DECLARE_METHOD(jm_setImageableArea, sjc_Paper, "setImageableArea", "(DDDD)V");
 
     jdouble jPaperW, jPaperH;
 
     // NSPrintInfo paperSize is oriented. java Paper is not oriented. Take
     //  the -[NSPrintInfo orientation] into account when setting the Paper

@@ -165,11 +182,12 @@
             jPaperW = paperSize.width;
             jPaperH = paperSize.height;
             break;
     }
 
-    JNFCallVoidMethod(env, dst, jm_setSize, jPaperW, jPaperH); // AWT_THREADING Safe (known object - always actual Paper)
+    (*env)->CallVoidMethod(env, dst, jm_setSize, jPaperW, jPaperH); // AWT_THREADING Safe (known object - always actual Paper)
+    CHECK_EXCEPTION();
 
     // Set the imageable area from the margins
     CGFloat leftM = [src leftMargin];
     CGFloat rightM = [src rightMargin];
     CGFloat topM = [src topMargin];

@@ -178,39 +196,48 @@
     jdouble jImageX = leftM;
     jdouble jImageY = topM;
     jdouble jImageW = jPaperW - (leftM + rightM);
     jdouble jImageH = jPaperH - (topM + bottomM);
 
-    JNFCallVoidMethod(env, dst, jm_setImageableArea, jImageX, jImageY, jImageW, jImageH); // AWT_THREADING Safe (known object - always actual Paper)
+    (*env)->CallVoidMethod(env, dst, jm_setImageableArea, jImageX, jImageY, jImageW, jImageH); // AWT_THREADING Safe (known object - always actual Paper)
+    CHECK_EXCEPTION();
 }
 
 static void javaPaperToNSPrintInfo(JNIEnv* env, jobject src, NSPrintInfo* dst)
 {
     AWT_ASSERT_NOT_APPKIT_THREAD;
 
-    static JNF_MEMBER_CACHE(jm_getWidth, sjc_Paper, "getWidth", "()D");
-    static JNF_MEMBER_CACHE(jm_getHeight, sjc_Paper, "getHeight", "()D");
-    static JNF_MEMBER_CACHE(jm_getImageableX, sjc_Paper, "getImageableX", "()D");
-    static JNF_MEMBER_CACHE(jm_getImageableY, sjc_Paper, "getImageableY", "()D");
-    static JNF_MEMBER_CACHE(jm_getImageableW, sjc_Paper, "getImageableWidth", "()D");
-    static JNF_MEMBER_CACHE(jm_getImageableH, sjc_Paper, "getImageableHeight", "()D");
+    GET_PAGEFORMAT_CLASS();
+    GET_PAPER_CLASS();
+    DECLARE_METHOD(jm_getWidth, sjc_Paper, "getWidth", "()D");
+    DECLARE_METHOD(jm_getHeight, sjc_Paper, "getHeight", "()D");
+    DECLARE_METHOD(jm_getImageableX, sjc_Paper, "getImageableX", "()D");
+    DECLARE_METHOD(jm_getImageableY, sjc_Paper, "getImageableY", "()D");
+    DECLARE_METHOD(jm_getImageableW, sjc_Paper, "getImageableWidth", "()D");
+    DECLARE_METHOD(jm_getImageableH, sjc_Paper, "getImageableHeight", "()D");
 
     // java Paper is always Portrait oriented. Set NSPrintInfo with this
     //  rectangle, and it's orientation may change. If necessary, be sure to call
     //  -[NSPrintInfo setOrientation] after this call, which will then
     //  adjust the -[NSPrintInfo paperSize] as well.
 
-    jdouble jPhysicalWidth = JNFCallDoubleMethod(env, src, jm_getWidth); // AWT_THREADING Safe (!appKit)
-    jdouble jPhysicalHeight = JNFCallDoubleMethod(env, src, jm_getHeight); // AWT_THREADING Safe (!appKit)
+    jdouble jPhysicalWidth = (*env)->CallDoubleMethod(env, src, jm_getWidth); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
+    jdouble jPhysicalHeight = (*env)->CallDoubleMethod(env, src, jm_getHeight); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
 
     [dst setPaperSize:NSMakeSize(jPhysicalWidth, jPhysicalHeight)];
 
     // Set the margins from the imageable area
-    jdouble jImageX = JNFCallDoubleMethod(env, src, jm_getImageableX); // AWT_THREADING Safe (!appKit)
-    jdouble jImageY = JNFCallDoubleMethod(env, src, jm_getImageableY); // AWT_THREADING Safe (!appKit)
-    jdouble jImageW = JNFCallDoubleMethod(env, src, jm_getImageableW); // AWT_THREADING Safe (!appKit)
-    jdouble jImageH = JNFCallDoubleMethod(env, src, jm_getImageableH); // AWT_THREADING Safe (!appKit)
+    jdouble jImageX = (*env)->CallDoubleMethod(env, src, jm_getImageableX); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
+    jdouble jImageY = (*env)->CallDoubleMethod(env, src, jm_getImageableY); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
+    jdouble jImageW = (*env)->CallDoubleMethod(env, src, jm_getImageableW); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
+    jdouble jImageH = (*env)->CallDoubleMethod(env, src, jm_getImageableH); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
 
     [dst setLeftMargin:(CGFloat)jImageX];
     [dst setTopMargin:(CGFloat)jImageY];
     [dst setRightMargin:(CGFloat)(jPhysicalWidth - jImageW - jImageX)];
     [dst setBottomMargin:(CGFloat)(jPhysicalHeight - jImageH - jImageY)];

@@ -218,13 +245,16 @@
 
 static void nsPrintInfoToJavaPageFormat(JNIEnv* env, NSPrintInfo* src, jobject dst)
 {
     AWT_ASSERT_NOT_APPKIT_THREAD;
 
-    static JNF_MEMBER_CACHE(jm_setOrientation, sjc_PageFormat, "setOrientation", "(I)V");
-    static JNF_MEMBER_CACHE(jm_setPaper, sjc_PageFormat, "setPaper", "(Ljava/awt/print/Paper;)V");
-    static JNF_CTOR_CACHE(jm_Paper_ctor, sjc_Paper, "()V");
+    GET_CPRINTERJOB_CLASS();
+    GET_PAGEFORMAT_CLASS();
+    GET_PAPER_CLASS();
+    DECLARE_METHOD(jm_setOrientation, sjc_PageFormat, "setOrientation", "(I)V");
+    DECLARE_METHOD(jm_setPaper, sjc_PageFormat, "setPaper", "(Ljava/awt/print/Paper;)V");
+    DECLARE_METHOD(jm_Paper_ctor, sjc_Paper, "<init>", "()V");
 
     jint jOrientation;
     switch ([src orientation]) {
         case NS_PORTRAIT:
             jOrientation = java_awt_print_PageFormat_PORTRAIT;

@@ -244,43 +274,53 @@
         default:
             jOrientation = java_awt_print_PageFormat_PORTRAIT;
             break;
     }
 
-    JNFCallVoidMethod(env, dst, jm_setOrientation, jOrientation); // AWT_THREADING Safe (!appKit)
+    (*env)->CallVoidMethod(env, dst, jm_setOrientation, jOrientation); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
 
     // Create a new Paper
-    jobject paper = JNFNewObject(env, jm_Paper_ctor); // AWT_THREADING Safe (known object)
+    jobject paper = (*env)->NewObject(env, sjc_Paper, jm_Paper_ctor); // AWT_THREADING Safe (known object)
+    CHECK_EXCEPTION();
+    if (paper == NULL) {
+        return;
+    }
 
     nsPrintInfoToJavaPaper(env, src, paper);
 
     // Set the Paper in the PageFormat
-    JNFCallVoidMethod(env, dst, jm_setPaper, paper); // AWT_THREADING Safe (!appKit)
+    (*env)->CallVoidMethod(env, dst, jm_setPaper, paper); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
 
     (*env)->DeleteLocalRef(env, paper);
 }
 
 static void javaPageFormatToNSPrintInfo(JNIEnv* env, jobject srcPrintJob, jobject srcPageFormat, NSPrintInfo* dstPrintInfo)
 {
     AWT_ASSERT_NOT_APPKIT_THREAD;
 
-    static JNF_MEMBER_CACHE(jm_getOrientation, sjc_PageFormat, "getOrientation", "()I");
-    static JNF_MEMBER_CACHE(jm_getPaper, sjc_PageFormat, "getPaper", "()Ljava/awt/print/Paper;");
-    static JNF_MEMBER_CACHE(jm_getPrinterName, sjc_CPrinterJob, "getPrinterName", "()Ljava/lang/String;");
+    GET_CPRINTERJOB_CLASS();
+    GET_PAGEFORMAT_CLASS();
+    GET_PAPER_CLASS();
+    DECLARE_METHOD(jm_getOrientation, sjc_PageFormat, "getOrientation", "()I");
+    DECLARE_METHOD(jm_getPaper, sjc_PageFormat, "getPaper", "()Ljava/awt/print/Paper;");
+    DECLARE_METHOD(jm_getPrinterName, sjc_CPrinterJob, "getPrinterName", "()Ljava/lang/String;");
 
     // When setting page information (orientation, size) in NSPrintInfo, set the
     //  rectangle first. This is because setting the orientation will change the
     //  rectangle to match.
 
     // Set up the paper. This will force Portrait since java Paper is
     //  not oriented. Then setting the NSPrintInfo orientation below
     //  will flip NSPrintInfo's info as necessary.
-    jobject paper = JNFCallObjectMethod(env, srcPageFormat, jm_getPaper); // AWT_THREADING Safe (!appKit)
+    jobject paper = (*env)->CallObjectMethod(env, srcPageFormat, jm_getPaper); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
     javaPaperToNSPrintInfo(env, paper, dstPrintInfo);
     (*env)->DeleteLocalRef(env, paper);
 
-    switch (JNFCallIntMethod(env, srcPageFormat, jm_getOrientation)) { // AWT_THREADING Safe (!appKit)
+    switch ((*env)->CallIntMethod(env, srcPageFormat, jm_getOrientation)) { // AWT_THREADING Safe (!appKit)
         case java_awt_print_PageFormat_PORTRAIT:
             [dstPrintInfo setOrientation:NS_PORTRAIT];
             break;
 
         case java_awt_print_PageFormat_LANDSCAPE:

@@ -294,48 +334,53 @@
 
         default:
             [dstPrintInfo setOrientation:NS_PORTRAIT];
             break;
     }
+    CHECK_EXCEPTION();
 
     // <rdar://problem/4022422> NSPrinterInfo is not correctly set to the selected printer
     // from the Java side of CPrinterJob. Has always assumed the default printer was the one we wanted.
     if (srcPrintJob == NULL) return;
-    jobject printerNameObj = JNFCallObjectMethod(env, srcPrintJob, jm_getPrinterName);
+    jobject printerNameObj = (*env)->CallObjectMethod(env, srcPrintJob, jm_getPrinterName);
+    CHECK_EXCEPTION();
     if (printerNameObj == NULL) return;
-    NSString *printerName = JNFJavaToNSString(env, printerNameObj);
+    NSString *printerName = JavaStringToNSString(env, printerNameObj);
     if (printerName == nil) return;
     NSPrinter *printer = [NSPrinter printerWithName:printerName];
     if (printer == nil) return;
     [dstPrintInfo setPrinter:printer];
 }
 
 static void nsPrintInfoToJavaPrinterJob(JNIEnv* env, NSPrintInfo* src, jobject dstPrinterJob, jobject dstPageable)
 {
-    static JNF_MEMBER_CACHE(jm_setService, sjc_CPrinterJob, "setPrinterServiceFromNative", "(Ljava/lang/String;)V");
-    static JNF_MEMBER_CACHE(jm_setCopiesAttribute, sjc_CPrinterJob, "setCopiesAttribute", "(I)V");
-    static JNF_MEMBER_CACHE(jm_setCollated, sjc_CPrinterJob, "setCollated", "(Z)V");
-    static JNF_MEMBER_CACHE(jm_setPageRangeAttribute, sjc_CPrinterJob, "setPageRangeAttribute", "(IIZ)V");
+    GET_CPRINTERJOB_CLASS();
+    DECLARE_METHOD(jm_setService, sjc_CPrinterJob, "setPrinterServiceFromNative", "(Ljava/lang/String;)V");
+    DECLARE_METHOD(jm_setCopiesAttribute, sjc_CPrinterJob, "setCopiesAttribute", "(I)V");
+    DECLARE_METHOD(jm_setCollated, sjc_CPrinterJob, "setCollated", "(Z)V");
+    DECLARE_METHOD(jm_setPageRangeAttribute, sjc_CPrinterJob, "setPageRangeAttribute", "(IIZ)V");
 
     // get the selected printer's name, and set the appropriate PrintService on the Java side
     NSString *name = [[src printer] name];
-    jstring printerName = JNFNSToJavaString(env, name);
-    JNFCallVoidMethod(env, dstPrinterJob, jm_setService, printerName);
-
+    jstring printerName = NSStringToJavaString(env, name);
+    (*env)->CallVoidMethod(env, dstPrinterJob, jm_setService, printerName);
+    CHECK_EXCEPTION();
 
     NSMutableDictionary* printingDictionary = [src dictionary];
 
     NSNumber* nsCopies = [printingDictionary objectForKey:NSPrintCopies];
     if ([nsCopies respondsToSelector:@selector(integerValue)])
     {
-        JNFCallVoidMethod(env, dstPrinterJob, jm_setCopiesAttribute, [nsCopies integerValue]); // AWT_THREADING Safe (known object)
+        (*env)->CallVoidMethod(env, dstPrinterJob, jm_setCopiesAttribute, [nsCopies integerValue]); // AWT_THREADING Safe (known object)
+        CHECK_EXCEPTION();
     }
 
     NSNumber* nsCollated = [printingDictionary objectForKey:NSPrintMustCollate];
     if ([nsCollated respondsToSelector:@selector(boolValue)])
     {
-        JNFCallVoidMethod(env, dstPrinterJob, jm_setCollated, [nsCollated boolValue] ? JNI_TRUE : JNI_FALSE); // AWT_THREADING Safe (known object)
+        (*env)->CallVoidMethod(env, dstPrinterJob, jm_setCollated, [nsCollated boolValue] ? JNI_TRUE : JNI_FALSE); // AWT_THREADING Safe (known object)
+        CHECK_EXCEPTION();
     }
 
     NSNumber* nsPrintAllPages = [printingDictionary objectForKey:NSPrintAllPages];
     if ([nsPrintAllPages respondsToSelector:@selector(boolValue)])
     {

@@ -354,52 +399,59 @@
             {
                 jLastPage = [nsLastPage integerValue] - 1;
             }
             isRangeSet = true;
         }
-        JNFCallVoidMethod(env, dstPrinterJob, jm_setPageRangeAttribute,
-                          jFirstPage, jLastPage, isRangeSet);
-            // AWT_THREADING Safe (known object)
+        (*env)->CallVoidMethod(env, dstPrinterJob, jm_setPageRangeAttribute,
+                          jFirstPage, jLastPage, isRangeSet); // AWT_THREADING Safe (known object)
+        CHECK_EXCEPTION();
 
     }
 }
 
 static void javaPrinterJobToNSPrintInfo(JNIEnv* env, jobject srcPrinterJob, jobject srcPageable, NSPrintInfo* dst)
 {
     AWT_ASSERT_NOT_APPKIT_THREAD;
 
-    static JNF_CLASS_CACHE(jc_Pageable, "java/awt/print/Pageable");
-    static JNF_MEMBER_CACHE(jm_getCopies, sjc_CPrinterJob, "getCopiesInt", "()I");
-    static JNF_MEMBER_CACHE(jm_isCollated, sjc_CPrinterJob, "isCollated", "()Z");
-    static JNF_MEMBER_CACHE(jm_getFromPage, sjc_CPrinterJob, "getFromPageAttrib", "()I");
-    static JNF_MEMBER_CACHE(jm_getToPage, sjc_CPrinterJob, "getToPageAttrib", "()I");
-    static JNF_MEMBER_CACHE(jm_getMinPage, sjc_CPrinterJob, "getMinPageAttrib", "()I");
-    static JNF_MEMBER_CACHE(jm_getMaxPage, sjc_CPrinterJob, "getMaxPageAttrib", "()I");
-    static JNF_MEMBER_CACHE(jm_getSelectAttrib, sjc_CPrinterJob, "getSelectAttrib", "()I");
-    static JNF_MEMBER_CACHE(jm_getNumberOfPages, jc_Pageable, "getNumberOfPages", "()I");
-    static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormatFromAttributes", "()Ljava/awt/print/PageFormat;");
+    DECLARE_CLASS(jc_Pageable, "java/awt/print/Pageable");
+    DECLARE_METHOD(jm_getCopies, sjc_CPrinterJob, "getCopiesInt", "()I");
+    DECLARE_METHOD(jm_isCollated, sjc_CPrinterJob, "isCollated", "()Z");
+    DECLARE_METHOD(jm_getFromPage, sjc_CPrinterJob, "getFromPageAttrib", "()I");
+    DECLARE_METHOD(jm_getToPage, sjc_CPrinterJob, "getToPageAttrib", "()I");
+    DECLARE_METHOD(jm_getMinPage, sjc_CPrinterJob, "getMinPageAttrib", "()I");
+    DECLARE_METHOD(jm_getMaxPage, sjc_CPrinterJob, "getMaxPageAttrib", "()I");
+    DECLARE_METHOD(jm_getSelectAttrib, sjc_CPrinterJob, "getSelectAttrib", "()I");
+    DECLARE_METHOD(jm_getNumberOfPages, jc_Pageable, "getNumberOfPages", "()I");
+    DECLARE_METHOD(jm_getPageFormat, sjc_CPrinterJob, "getPageFormatFromAttributes", "()Ljava/awt/print/PageFormat;");
 
     NSMutableDictionary* printingDictionary = [dst dictionary];
 
-    jint copies = JNFCallIntMethod(env, srcPrinterJob, jm_getCopies); // AWT_THREADING Safe (known object)
+    jint copies = (*env)->CallIntMethod(env, srcPrinterJob, jm_getCopies); // AWT_THREADING Safe (known object)
+    CHECK_EXCEPTION();
     [printingDictionary setObject:[NSNumber numberWithInteger:copies] forKey:NSPrintCopies];
 
-    jboolean collated = JNFCallBooleanMethod(env, srcPrinterJob, jm_isCollated); // AWT_THREADING Safe (known object)
+    jboolean collated = (*env)->CallBooleanMethod(env, srcPrinterJob, jm_isCollated); // AWT_THREADING Safe (known object)
+    CHECK_EXCEPTION();
     [printingDictionary setObject:[NSNumber numberWithBool:collated ? YES : NO] forKey:NSPrintMustCollate];
-    jint selectID = JNFCallIntMethod(env, srcPrinterJob, jm_getSelectAttrib);
-    jint fromPage = JNFCallIntMethod(env, srcPrinterJob, jm_getFromPage);
-    jint toPage = JNFCallIntMethod(env, srcPrinterJob, jm_getToPage);
+    jint selectID = (*env)->CallIntMethod(env, srcPrinterJob, jm_getSelectAttrib);
+    CHECK_EXCEPTION();
+    jint fromPage = (*env)->CallIntMethod(env, srcPrinterJob, jm_getFromPage);
+    CHECK_EXCEPTION();
+    jint toPage = (*env)->CallIntMethod(env, srcPrinterJob, jm_getToPage);
+    CHECK_EXCEPTION();
     if (selectID ==0) {
         [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintAllPages];
     } else if (selectID == 2) {
         // In Mac 10.7,  Print ALL is deselected if PrintSelection is YES whether
         // NSPrintAllPages is YES or NO
         [printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages];
         [printingDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSPrintSelectionOnly];
     } else {
-        jint minPage = JNFCallIntMethod(env, srcPrinterJob, jm_getMinPage);
-        jint maxPage = JNFCallIntMethod(env, srcPrinterJob, jm_getMaxPage);
+        jint minPage = (*env)->CallIntMethod(env, srcPrinterJob, jm_getMinPage);
+        CHECK_EXCEPTION();
+        jint maxPage = (*env)->CallIntMethod(env, srcPrinterJob, jm_getMaxPage);
+        CHECK_EXCEPTION();
 
         // for PD_SELECTION or PD_NOSELECTION, check from/to page
         // to determine which radio button to select
         if (fromPage > minPage || toPage < maxPage) {
             [printingDictionary setObject:[NSNumber numberWithBool:NO] forKey:NSPrintAllPages];

@@ -410,11 +462,12 @@
 
     // setting fromPage and toPage will not be shown in the dialog if printing All pages
     [printingDictionary setObject:[NSNumber numberWithInteger:fromPage] forKey:NSPrintFirstPage];
     [printingDictionary setObject:[NSNumber numberWithInteger:toPage] forKey:NSPrintLastPage];
 
-    jobject page = JNFCallObjectMethod(env, srcPrinterJob, jm_getPageFormat);
+    jobject page = (*env)->CallObjectMethod(env, srcPrinterJob, jm_getPageFormat);
+    CHECK_EXCEPTION();
     if (page != NULL) {
         javaPageFormatToNSPrintInfo(env, NULL, page, dst);
     }
 }
 

@@ -424,52 +477,53 @@
  * Signature: ()V
  */
 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPrinterJob_abortDoc
   (JNIEnv *env, jobject jthis)
 {
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
     // This is only called during the printLoop from the printLoop thread
     NSPrintOperation* printLoop = [NSPrintOperation currentOperation];
     NSPrintInfo* printInfo = [printLoop printInfo];
     [printInfo setJobDisposition:NSPrintCancelJob];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
 }
 
 /*
  * Class:     sun_lwawt_macosx_CPrinterJob
  * Method:    getDefaultPage
  * Signature: (Ljava/awt/print/PageFormat;)V
  */
 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPrinterJob_getDefaultPage
   (JNIEnv *env, jobject jthis, jobject page)
 {
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
     NSPrintInfo* printInfo = createDefaultNSPrintInfo(env, NULL);
 
     nsPrintInfoToJavaPageFormat(env, printInfo, page);
 
     [printInfo release];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
 }
 
 /*
  * Class:     sun_lwawt_macosx_CPrinterJob
  * Method:    validatePaper
  * Signature: (Ljava/awt/print/Paper;Ljava/awt/print/Paper;)V
  */
 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPrinterJob_validatePaper
   (JNIEnv *env, jobject jthis, jobject origpaper, jobject newpaper)
 {
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
+
 
     NSPrintInfo* printInfo = createDefaultNSPrintInfo(env, NULL);
     javaPaperToNSPrintInfo(env, origpaper, printInfo);
     makeBestFit(printInfo);
     nsPrintInfoToJavaPaper(env, printInfo, newpaper);
     [printInfo release];
 
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
 }
 
 /*
  * Class:     sun_lwawt_macosx_CPrinterJob
  * Method:    createNSPrintInfo

@@ -477,19 +531,19 @@
  */
 JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CPrinterJob_createNSPrintInfo
   (JNIEnv *env, jobject jthis)
 {
     jlong result = -1;
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
     // This is used to create the NSPrintInfo for this PrinterJob. Thread
     //  safety is assured by the java side of this call.
 
     NSPrintInfo* printInfo = createDefaultNSPrintInfo(env, NULL);
 
     result = ptr_to_jlong(printInfo);
 
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
     return result;
 }
 
 /*
  * Class:     sun_lwawt_macosx_CPrinterJob

@@ -497,17 +551,17 @@
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPrinterJob_dispose
   (JNIEnv *env, jobject jthis, jlong nsPrintInfo)
 {
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
     if (nsPrintInfo != -1)
     {
         NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr(nsPrintInfo);
         [printInfo release];
     }
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
 }
 
 
 /*
  * Class:     sun_lwawt_macosx_CPrinterJob

@@ -517,53 +571,61 @@
 JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CPrinterJob_printLoop
   (JNIEnv *env, jobject jthis, jboolean blocks, jint firstPage, jint lastPage)
 {
     AWT_ASSERT_NOT_APPKIT_THREAD;
 
-    static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormat", "(I)Ljava/awt/print/PageFormat;");
-    static JNF_MEMBER_CACHE(jm_getPageFormatArea, sjc_CPrinterJob, "getPageFormatArea", "(Ljava/awt/print/PageFormat;)Ljava/awt/geom/Rectangle2D;");
-    static JNF_MEMBER_CACHE(jm_getPrinterName, sjc_CPrinterJob, "getPrinterName", "()Ljava/lang/String;");
-    static JNF_MEMBER_CACHE(jm_getPageable, sjc_CPrinterJob, "getPageable", "()Ljava/awt/print/Pageable;");
-    static JNF_MEMBER_CACHE(jm_getPrinterTray, sjc_CPrinterJob, "getPrinterTray", "()Ljava/lang/String;");
+    GET_CPRINTERJOB_CLASS_RETURN(NO);
+    DECLARE_METHOD_RETURN(jm_getPageFormat, sjc_CPrinterJob, "getPageFormat", "(I)Ljava/awt/print/PageFormat;", NO);
+    DECLARE_METHOD_RETURN(jm_getPageFormatArea, sjc_CPrinterJob, "getPageFormatArea", "(Ljava/awt/print/PageFormat;)Ljava/awt/geom/Rectangle2D;", NO);
+    DECLARE_METHOD_RETURN(jm_getPrinterName, sjc_CPrinterJob, "getPrinterName", "()Ljava/lang/String;", NO);
+    DECLARE_METHOD_RETURN(jm_getPageable, sjc_CPrinterJob, "getPageable", "()Ljava/awt/print/Pageable;", NO);
+    DECLARE_METHOD_RETURN(jm_getPrinterTray, sjc_CPrinterJob, "getPrinterTray", "()Ljava/lang/String;", NO);
 
     jboolean retVal = JNI_FALSE;
 
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
     // Get the first page's PageFormat for setting things up (This introduces
     //  and is a facet of the same problem in Radar 2818593/2708932).
-    jobject page = JNFCallObjectMethod(env, jthis, jm_getPageFormat, 0); // AWT_THREADING Safe (!appKit)
+    jobject page = (*env)->CallObjectMethod(env, jthis, jm_getPageFormat, 0); // AWT_THREADING Safe (!appKit)
+    CHECK_EXCEPTION();
     if (page != NULL) {
-        jobject pageFormatArea = JNFCallObjectMethod(env, jthis, jm_getPageFormatArea, page); // AWT_THREADING Safe (!appKit)
+        jobject pageFormatArea = (*env)->CallObjectMethod(env, jthis, jm_getPageFormatArea, page); // AWT_THREADING Safe (!appKit)
+        CHECK_EXCEPTION();
 
         PrinterView* printerView = [[PrinterView alloc] initWithFrame:JavaToNSRect(env, pageFormatArea) withEnv:env withPrinterJob:jthis];
         [printerView setFirstPage:firstPage lastPage:lastPage];
 
-        NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr(JNFCallLongMethod(env, jthis, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
-        jobject printerTrayObj = JNFCallObjectMethod(env, jthis, jm_getPrinterTray);
+        GET_NSPRINTINFO_METHOD_RETURN(NO)
+        NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr((*env)->CallLongMethod(env, jthis, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
+        CHECK_EXCEPTION();
+        jobject printerTrayObj = (*env)->CallObjectMethod(env, jthis, jm_getPrinterTray);
+        CHECK_EXCEPTION();
         if (printerTrayObj != NULL) {
-            NSString *printerTray = JNFJavaToNSString(env, printerTrayObj);
+            NSString *printerTray = JavaStringToNSString(env, printerTrayObj);
             if (printerTray != nil) {
                 [[printInfo printSettings] setObject:printerTray forKey:@"InputSlot"];
             }
         }
 
         // <rdar://problem/4156975> passing jthis CPrinterJob as well, so we can extract the printer name from the current job
         javaPageFormatToNSPrintInfo(env, jthis, page, printInfo);
 
         // <rdar://problem/4093799> NSPrinterInfo is not correctly set to the selected printer
         // from the Java side of CPrinterJob. Had always assumed the default printer was the one we wanted.
-        jobject printerNameObj = JNFCallObjectMethod(env, jthis, jm_getPrinterName);
+        jobject printerNameObj = (*env)->CallObjectMethod(env, jthis, jm_getPrinterName);
+        CHECK_EXCEPTION();
         if (printerNameObj != NULL) {
-            NSString *printerName = JNFJavaToNSString(env, printerNameObj);
+            NSString *printerName = JavaStringToNSString(env, printerNameObj);
             if (printerName != nil) {
                 NSPrinter *printer = [NSPrinter printerWithName:printerName];
                 if (printer != nil) [printInfo setPrinter:printer];
             }
         }
 
         // <rdar://problem/4367998> JTable.print attributes are ignored
-        jobject pageable = JNFCallObjectMethod(env, jthis, jm_getPageable); // AWT_THREADING Safe (!appKit)
+        jobject pageable = (*env)->CallObjectMethod(env, jthis, jm_getPageable); // AWT_THREADING Safe (!appKit)
+        CHECK_EXCEPTION();
         javaPrinterJobToNSPrintInfo(env, jthis, pageable, printInfo);
 
         PrintModel* printModel = [[PrintModel alloc] initWithPrintInfo:printInfo];
 
         (void)[printModel runPrintLoopWithView:printerView waitUntilDone:blocks withEnv:env];

@@ -582,11 +644,11 @@
         if (pageFormatArea != NULL)
         {
             (*env)->DeleteLocalRef(env, pageFormatArea);
         }
     }
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
     return retVal;
 }
 
 /*
  * Class:     sun_lwawt_macosx_CPrinterPageDialog

@@ -595,19 +657,25 @@
  */
 JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CPrinterPageDialog_showDialog
   (JNIEnv *env, jobject jthis)
 {
 
-    static JNF_CLASS_CACHE(jc_CPrinterPageDialog, "sun/lwawt/macosx/CPrinterPageDialog");
-    static JNF_MEMBER_CACHE(jm_page, jc_CPrinterPageDialog, "fPage", "Ljava/awt/print/PageFormat;");
+    DECLARE_CLASS_RETURN(jc_CPrinterPageDialog, "sun/lwawt/macosx/CPrinterPageDialog", NO);
+    DECLARE_FIELD_RETURN(jm_page, jc_CPrinterPageDialog, "fPage", "Ljava/awt/print/PageFormat;", NO);
 
     jboolean result = JNI_FALSE;
-JNF_COCOA_ENTER(env);
-    jobject printerJob = JNFGetObjectField(env, jthis, sjm_printerJob);
-    NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr(JNFCallLongMethod(env, printerJob, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
+JNI_COCOA_ENTER(env);
+    GET_CPRINTERDIALOG_FIELD_RETURN(NO);
+    GET_NSPRINTINFO_METHOD_RETURN(NO)
+    jobject printerJob = (*env)->GetObjectField(env, jthis, sjm_printerJob);
+    if (printerJob == NULL) return NO;
+    NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr((*env)->CallLongMethod(env, printerJob, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
+    CHECK_EXCEPTION();
+    if (printInfo == NULL) return result;
 
-    jobject page = JNFGetObjectField(env, jthis, jm_page);
+    jobject page = (*env)->GetObjectField(env, jthis, jm_page);
+    if (page == NULL) return NO;
 
     // <rdar://problem/4156975> passing NULL, because only a CPrinterJob has a real printer associated with it
     javaPageFormatToNSPrintInfo(env, NULL, page, printInfo);
 
     PrintModel* printModel = [[PrintModel alloc] initWithPrintInfo:printInfo];

@@ -627,11 +695,11 @@
     if (page != NULL)
     {
         (*env)->DeleteLocalRef(env, page);
     }
 
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
     return result;
 }
 
 /*
  * Class:     sun_lwawt_macosx_CPrinterJobDialog

@@ -639,19 +707,23 @@
  * Signature: ()Z
  */
 JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CPrinterJobDialog_showDialog
   (JNIEnv *env, jobject jthis)
 {
-    static JNF_CLASS_CACHE(jc_CPrinterJobDialog, "sun/lwawt/macosx/CPrinterJobDialog");
-    static JNF_MEMBER_CACHE(jm_pageable, jc_CPrinterJobDialog, "fPageable", "Ljava/awt/print/Pageable;");
+    DECLARE_CLASS_RETURN(jc_CPrinterJobDialog, "sun/lwawt/macosx/CPrinterJobDialog", NO);
+    DECLARE_FIELD_RETURN(jm_pageable, jc_CPrinterJobDialog, "fPageable", "Ljava/awt/print/Pageable;", NO);
 
     jboolean result = JNI_FALSE;
-JNF_COCOA_ENTER(env);
-    jobject printerJob = JNFGetObjectField(env, jthis, sjm_printerJob);
-    NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr(JNFCallLongMethod(env, printerJob, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
+JNI_COCOA_ENTER(env);
+    GET_CPRINTERDIALOG_FIELD_RETURN(NO);
+    jobject printerJob = (*env)->GetObjectField(env, jthis, sjm_printerJob);
+    if (printerJob == NULL) return NO;
+    GET_NSPRINTINFO_METHOD_RETURN(NO)
+    NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr((*env)->CallLongMethod(env, printerJob, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
 
-    jobject pageable = JNFGetObjectField(env, jthis, jm_pageable);
+    jobject pageable = (*env)->GetObjectField(env, jthis, jm_pageable);
+    if (pageable == NULL) return NO;
 
     javaPrinterJobToNSPrintInfo(env, printerJob, pageable, printInfo);
 
     PrintModel* printModel = [[PrintModel alloc] initWithPrintInfo:printInfo];
     result = [printModel runJobSetup];

@@ -670,8 +742,8 @@
     if (pageable != NULL)
     {
         (*env)->DeleteLocalRef(env, pageable);
     }
 
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
     return result;
 }
< prev index next >