changeset 5598:6cd68b7bd962

7181501: Add some GenerateNativeHeader annotations and misc Mac adjustments to makefiles Reviewed-by: ohair
author erikj
date Tue, 03 Jul 2012 16:01:59 -0700
parents 8cb908672d9e
children 5b0f880eb154
files src/macosx/native/jobjc/build.xml src/macosx/native/jobjc/src/core/PrimitiveCoder.hs src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CFType.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Coder.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/FFIType.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Function.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/ID.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Invoke.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/JObjCRuntime.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/MacOSXFramework.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NSClass.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeArgumentBuffer.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeBuffer.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeObjectLifecycleManager.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Opaque.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Pointer.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/SEL.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Struct.java src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Subclassing.java src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/FrameworkClassFile.java src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Clazz.java src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/coders/ComplexCoderDescriptor.java
diffstat 23 files changed, 157 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/macosx/native/jobjc/build.xml	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/build.xml	Tue Jul 03 16:01:59 2012 -0700
@@ -140,8 +140,16 @@
     <!-- Compile PrimitiveCoder first to work around javac bug. -->
     <javac srcdir="${core.src}" destdir="${core.bin}" source="1.5" target="1.5" debug="${compile.debug}"
            includes="**/PrimitiveCoder.java"
-           includeantruntime="false" />
-    <javac srcdir="${core.src}" destdir="${core.bin}" source="1.5" target="1.5" debug="${compile.debug}" includeantruntime="false" />
+           includeantruntime="false">
+      <classpath>
+        <path location="${obj}/../langtools/dist/lib/classes.jar"/>
+      </classpath>
+    </javac>
+    <javac srcdir="${core.src}" destdir="${core.bin}" source="1.5" target="1.5" debug="${compile.debug}" includeantruntime="false">
+      <classpath>
+        <path location="${obj}/../langtools/dist/lib/classes.jar"/>
+      </classpath>
+    </javac>
 
     <exec executable="/usr/bin/perl" outputproperty="core.classes" failonerror="true">
       <arg value="${src}/extract_classes.pl"/>
--- a/src/macosx/native/jobjc/src/core/PrimitiveCoder.hs	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/PrimitiveCoder.hs	Tue Jul 03 16:01:59 2012 -0700
@@ -2,7 +2,7 @@
 
 {-
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011,2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -196,6 +196,8 @@
 c2java ntype =
     unlines [
  "// native " ++ ntypeS ++ " -> java " ++ jprimS,
+ "/* No native methods here, but the constants are needed in the supporting JNI code */",
+ "@GenerateNativeHeader",
  "public static final class " ++ className ++ " extends PrimitiveCoder<" ++ jclassS ++ ">{",
  "\tpublic static final " ++ className ++ " INST = new " ++ className ++ "();",
  "\tpublic " ++ className ++ "(){ super("++ffitypeVal ntype++", \"" ++ [encoding ntype] ++ "\", "++jclassS++".class, "++jprimS++".class); }",
@@ -246,10 +248,13 @@
   putStrLn "package com.apple.jobjc;"
 
   putStrLn "import com.apple.jobjc.JObjCRuntime.Width;"
+  putStrLn "import javax.tools.annotation.GenerateNativeHeader;"
 
   putStrLn "// Auto generated by PrimitiveCoder.hs"
   putStrLn "// Do not edit by hand."
 
+  putStrLn "/* No native methods here, but the constants are needed in the supporting JNI code */"
+  putStrLn "@GenerateNativeHeader"
   putStrLn "public abstract class PrimitiveCoder<T> extends Coder<T>{"
 
   putStrLn "\tpublic PrimitiveCoder(int ffiTypeCode, String objCEncoding, Class jclass, Class jprim){"
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CFType.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/CFType.java	Tue Jul 03 16:01:59 2012 -0700
@@ -24,6 +24,10 @@
  */
 package com.apple.jobjc;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class CFType extends Pointer<Void> {
     protected CFType(long ptr) { super(ptr); }
     protected CFType(Pointer<?> ptr) { super(ptr.ptr); }
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Coder.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Coder.java	Tue Jul 03 16:01:59 2012 -0700
@@ -35,6 +35,7 @@
 import com.apple.jobjc.PrimitiveCoder.SIntCoder;
 import com.apple.jobjc.PrimitiveCoder.SLongLongCoder;
 import com.apple.jobjc.PrimitiveCoder.SShortCoder;
+import javax.tools.annotation.GenerateNativeHeader;
 
 public abstract class Coder<T> {
     private static native long getNativeFFITypePtrForCode(final int code);
@@ -142,6 +143,8 @@
 
     //
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class VoidCoder extends Coder<Object>{
         public static final VoidCoder INST = new VoidCoder();
         public VoidCoder(){ super(FFI_VOID, "v", Void.class, void.class); }
@@ -150,6 +153,8 @@
         @Override public void push(JObjCRuntime runtime, long addr, Object x) { throw new RuntimeException("Trying to push a Void."); }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class UnknownCoder extends Coder<Object> {
         public static final UnknownCoder INST = new UnknownCoder();
         public UnknownCoder(){ super(-1, "?", null, null); }
@@ -158,6 +163,8 @@
         @Override public Object pop(JObjCRuntime runtime, long addr) { throw new RuntimeException("Coder not implemented"); }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class PrimitivePointerCoder extends Coder<Long> {
         public static final PrimitivePointerCoder INST = new PrimitivePointerCoder();
         public PrimitivePointerCoder(){ super(Coder.FFI_PTR, "^?", Long.class, long.class); }
@@ -187,6 +194,8 @@
         @Override public void push(JObjCRuntime runtime, long addr, Long x) { push(runtime, addr, (long) x); }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class PointerCoder extends Coder<Pointer> {
         public static final PointerCoder INST = new PointerCoder();
         public PointerCoder(){ super(FFI_PTR, "^?", Pointer.class); }
@@ -200,6 +209,8 @@
         }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class SELCoder extends Coder<SEL> {
         public static final SELCoder INST = new SELCoder();
         public SELCoder(){ super(FFI_PTR, ":", SEL.class); }
@@ -213,6 +224,8 @@
         }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static abstract class StructCoder extends Coder<Struct> {
         private final FFIType ffiType;
         final int sizeof;
@@ -254,6 +267,8 @@
         }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class IDCoder extends Coder<ID>{
         public static final IDCoder INST = new IDCoder();
         public IDCoder(){ super(FFI_PTR, "@", ID.class); }
@@ -272,6 +287,8 @@
         }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class NSClassCoder extends Coder<NSClass>{
         public static final NSClassCoder INST = new NSClassCoder();
         public NSClassCoder(){ super(FFI_PTR, "#", NSClass.class); }
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/FFIType.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/FFIType.java	Tue Jul 03 16:01:59 2012 -0700
@@ -26,6 +26,10 @@
 
 import com.apple.jobjc.Coder.PrimitivePointerCoder;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 class FFIType{
     private static native void makeFFIType(long ffi_type_buf, long elements_buf);
     private static native int  getFFITypeSizeof();
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Function.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Function.java	Tue Jul 03 16:01:59 2012 -0700
@@ -24,6 +24,10 @@
  */
 package com.apple.jobjc;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class Function {
     private static native long getFxnPtrForFunctionName(final String functionName);
     private static native long getFxnPtrForFunctionNameAndLib(final long libPtr, final String functionName);
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/ID.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/ID.java	Tue Jul 03 16:01:59 2012 -0700
@@ -29,6 +29,10 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class ID extends Pointer<Void>{
     static native String getNativeDescription(final long objPtr);
 
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Invoke.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Invoke.java	Tue Jul 03 16:01:59 2012 -0700
@@ -30,12 +30,18 @@
 import com.apple.jobjc.Coder.SELCoder;
 import com.apple.jobjc.Coder.StructCoder;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public abstract class Invoke {
     public abstract void invoke(NativeArgumentBuffer argBuf);
     public abstract void invoke(NativeArgumentBuffer buffer, Struct retvalStruct);
 
     //
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class FunCall extends Invoke{
         static native void invoke(long cifPtr, long fxnPtr, long retValPtr, long argsPtr);
 
@@ -72,6 +78,8 @@
         }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class MsgSend extends Invoke{
         static{ System.load("/usr/lib/libobjc.dylib"); }
 
@@ -157,6 +165,8 @@
         }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static final class MsgSendSuper extends Invoke{
         static{ System.load("/usr/lib/libobjc.dylib"); }
 
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/JObjCRuntime.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/JObjCRuntime.java	Tue Jul 03 16:01:59 2012 -0700
@@ -31,10 +31,16 @@
 
 import sun.misc.Unsafe;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public final class JObjCRuntime {
     static { System.loadLibrary("JObjC"); }
 
+    @GenerateNativeHeader
     public static enum Arch{ ppc, i386, x86_64 };
+    @GenerateNativeHeader
     public static enum Width{ W32, W64 };
 
     public static final Arch ARCH = getArch();
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/MacOSXFramework.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/MacOSXFramework.java	Tue Jul 03 16:01:59 2012 -0700
@@ -25,6 +25,10 @@
 package com.apple.jobjc;
 
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class MacOSXFramework {
     private static native long retainFramework(final String frameworkName);
     private static native void releaseFramework(final long frameworkPtr);
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NSClass.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NSClass.java	Tue Jul 03 16:01:59 2012 -0700
@@ -27,7 +27,13 @@
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Constructor;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class NSClass<T extends ID> extends ID {
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static class NSClassNotFoundException extends RuntimeException{
         public NSClassNotFoundException(String m){ super(m); }
         public NSClassNotFoundException(String m, Throwable cause){ super(m, cause); }
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeArgumentBuffer.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeArgumentBuffer.java	Tue Jul 03 16:01:59 2012 -0700
@@ -28,6 +28,10 @@
 
 import com.apple.jobjc.Coder.PrimitivePointerCoder;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public final class NativeArgumentBuffer{
     private static final ThreadLocal<NativeArgumentBuffer> threadLocal = new ThreadLocal<NativeArgumentBuffer>();
 
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeBuffer.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeBuffer.java	Tue Jul 03 16:01:59 2012 -0700
@@ -27,9 +27,13 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
 /**
  * A wrapper around a direct ByteBuffer and its native pointer. For documentation, @see java.nio.ByteBuffer
  */
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class NativeBuffer {
     static native long getPtrOfBuffer(final ByteBuffer byteBuffer);
 
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeObjectLifecycleManager.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/NativeObjectLifecycleManager.java	Tue Jul 03 16:01:59 2012 -0700
@@ -24,6 +24,10 @@
  */
 package com.apple.jobjc;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public abstract class NativeObjectLifecycleManager {
     private static native void retainNativeObject(final long ptr);
     private static native void releaseNativeObject(final long ptr);
@@ -33,6 +37,8 @@
     abstract void end(final long ptr);
     boolean shouldPreRetain() { return false; }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static class CFRetainRelease extends NativeObjectLifecycleManager {
         public static final NativeObjectLifecycleManager INST = new CFRetainRelease();
         @Override void begin(final long ptr) { retainNativeObject(ptr); }
@@ -40,12 +46,16 @@
         @Override boolean shouldPreRetain() { return true; }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static class Free extends NativeObjectLifecycleManager {
         public static final NativeObjectLifecycleManager INST = new Free();
         @Override void begin(final long ptr) { }
         @Override void end(final long ptr) { freeNativeObject(ptr); }
     }
 
+    /* No native methods here, but the constants are needed in the supporting JNI code */
+    @GenerateNativeHeader
     public static class Nothing extends NativeObjectLifecycleManager {
         public static final NativeObjectLifecycleManager INST = new Nothing();
         @Override void begin(final long ptr) { }
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Opaque.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Opaque.java	Tue Jul 03 16:01:59 2012 -0700
@@ -24,6 +24,10 @@
  */
 package com.apple.jobjc;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class Opaque extends Pointer<Void> {
     protected Opaque(long ptr) { super(ptr); }
     protected Opaque(Pointer<?> ptr) { super(ptr.ptr); }
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Pointer.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Pointer.java	Tue Jul 03 16:01:59 2012 -0700
@@ -24,6 +24,10 @@
  */
 package com.apple.jobjc;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class Pointer <T> implements Comparable<Pointer<T>>{
     long ptr;
 
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/PrimitiveCoder.java	Tue Jul 03 16:01:59 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011,2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,8 +24,11 @@
  */
 package com.apple.jobjc;
 import com.apple.jobjc.JObjCRuntime.Width;
+import javax.tools.annotation.GenerateNativeHeader;
 // Auto generated by PrimitiveCoder.hs
 // Do not edit by hand.
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public abstract class PrimitiveCoder<T> extends Coder<T>{
     public PrimitiveCoder(int ffiTypeCode, String objCEncoding, Class jclass, Class jprim){
         super(ffiTypeCode, objCEncoding, jclass, jprim);
@@ -127,6 +130,8 @@
 
 
 // native BOOL -> java boolean
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class BoolCoder extends PrimitiveCoder<Boolean>{
     public static final BoolCoder INST = new BoolCoder();
     public BoolCoder(){ super(FFI_SINT8, "B", Boolean.class, boolean.class); }
@@ -170,6 +175,8 @@
 }
 
 // native schar -> java byte
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class SCharCoder extends PrimitiveCoder<Byte>{
     public static final SCharCoder INST = new SCharCoder();
     public SCharCoder(){ super(FFI_SINT8, "c", Byte.class, byte.class); }
@@ -213,6 +220,8 @@
 }
 
 // native uchar -> java byte
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class UCharCoder extends PrimitiveCoder<Byte>{
     public static final UCharCoder INST = new UCharCoder();
     public UCharCoder(){ super(FFI_UINT8, "C", Byte.class, byte.class); }
@@ -256,6 +265,8 @@
 }
 
 // native sshort -> java short
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class SShortCoder extends PrimitiveCoder<Short>{
     public static final SShortCoder INST = new SShortCoder();
     public SShortCoder(){ super(FFI_SINT16, "s", Short.class, short.class); }
@@ -299,6 +310,8 @@
 }
 
 // native ushort -> java short
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class UShortCoder extends PrimitiveCoder<Short>{
     public static final UShortCoder INST = new UShortCoder();
     public UShortCoder(){ super(FFI_UINT16, "S", Short.class, short.class); }
@@ -342,6 +355,8 @@
 }
 
 // native sint -> java int
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class SIntCoder extends PrimitiveCoder<Integer>{
     public static final SIntCoder INST = new SIntCoder();
     public SIntCoder(){ super(FFI_SINT32, "i", Integer.class, int.class); }
@@ -385,6 +400,8 @@
 }
 
 // native uint -> java int
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class UIntCoder extends PrimitiveCoder<Integer>{
     public static final UIntCoder INST = new UIntCoder();
     public UIntCoder(){ super(FFI_UINT32, "I", Integer.class, int.class); }
@@ -428,6 +445,8 @@
 }
 
 // native slong -> java long
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class SLongCoder extends PrimitiveCoder<Long>{
     public static final SLongCoder INST = new SLongCoder();
     public SLongCoder(){ super((JObjCRuntime.IS64 ? (FFI_SINT64) : (FFI_SINT32)), "l", Long.class, long.class); }
@@ -477,6 +496,8 @@
 }
 
 // native ulong -> java long
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class ULongCoder extends PrimitiveCoder<Long>{
     public static final ULongCoder INST = new ULongCoder();
     public ULongCoder(){ super((JObjCRuntime.IS64 ? (FFI_UINT64) : (FFI_UINT32)), "L", Long.class, long.class); }
@@ -526,6 +547,8 @@
 }
 
 // native slonglong -> java long
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class SLongLongCoder extends PrimitiveCoder<Long>{
     public static final SLongLongCoder INST = new SLongLongCoder();
     public SLongLongCoder(){ super(FFI_SINT64, "q", Long.class, long.class); }
@@ -569,6 +592,8 @@
 }
 
 // native ulonglong -> java long
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class ULongLongCoder extends PrimitiveCoder<Long>{
     public static final ULongLongCoder INST = new ULongLongCoder();
     public ULongLongCoder(){ super(FFI_UINT64, "Q", Long.class, long.class); }
@@ -612,6 +637,8 @@
 }
 
 // native float -> java float
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class FloatCoder extends PrimitiveCoder<Float>{
     public static final FloatCoder INST = new FloatCoder();
     public FloatCoder(){ super(FFI_FLOAT, "f", Float.class, float.class); }
@@ -655,6 +682,8 @@
 }
 
 // native double -> java double
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public static final class DoubleCoder extends PrimitiveCoder<Double>{
     public static final DoubleCoder INST = new DoubleCoder();
     public DoubleCoder(){ super(FFI_DOUBLE, "d", Double.class, double.class); }
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/SEL.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/SEL.java	Tue Jul 03 16:01:59 2012 -0700
@@ -24,6 +24,10 @@
  */
 package com.apple.jobjc;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public class SEL {
     static native long getSelectorPtr(String selectorName);
     static native String getSelectorName(long ptr);
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Struct.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Struct.java	Tue Jul 03 16:01:59 2012 -0700
@@ -24,9 +24,13 @@
  */
 package com.apple.jobjc;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
 /**
  * A struct is malloced on the C heap and accessed in Java through a ByteBuffer.
  */
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 public abstract class Struct{
     protected final NativeBuffer raw;
     private final JObjCRuntime runtime;
--- a/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Subclassing.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/core/java/com/apple/jobjc/Subclassing.java	Tue Jul 03 16:01:59 2012 -0700
@@ -33,6 +33,10 @@
 import com.apple.jobjc.Coder.VoidCoder;
 import com.apple.jobjc.Invoke.MsgSend;
 
+import javax.tools.annotation.GenerateNativeHeader;
+
+/* No native methods here, but the constants are needed in the supporting JNI code */
+@GenerateNativeHeader
 final class Subclassing {
     static native long allocateClassPair(long superClass, String name);
     static native boolean addIVarForJObj(long clazz);
--- a/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/FrameworkClassFile.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/classes/FrameworkClassFile.java	Tue Jul 03 16:01:59 2012 -0700
@@ -28,6 +28,7 @@
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.TreeSet;
 
 import com.apple.internal.jobjc.generator.FunctionGenerator;
 import com.apple.internal.jobjc.generator.Utils;
@@ -130,7 +131,11 @@
             }
         }
 
-        for (final Clazz clazz : framework.classes) {
+        /**
+         * Order classes to get stable output
+         */
+        TreeSet<Clazz> sortedClasses = new TreeSet<Clazz>(framework.classes);
+        for (final Clazz clazz : sortedClasses) {
             final String classClassName = clazz.name + "Class";
             out.println(JavaLang.makeSingleton("_" + classClassName, clazz.name, classClassName, "getRuntime()"));
         }
--- a/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Clazz.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/Clazz.java	Tue Jul 03 16:01:59 2012 -0700
@@ -147,4 +147,8 @@
 
         return null;
     }
+
+    int compareTo(Clazz o) {
+      return toString().compareTo(o.toString());
+    }
 }
--- a/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/coders/ComplexCoderDescriptor.java	Tue Jul 03 11:45:34 2012 -0700
+++ b/src/macosx/native/jobjc/src/generator/java/com/apple/internal/jobjc/generator/model/coders/ComplexCoderDescriptor.java	Tue Jul 03 16:01:59 2012 -0700
@@ -25,7 +25,7 @@
 package com.apple.internal.jobjc.generator.model.coders;
 
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.TreeSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -40,7 +40,7 @@
  */
 public class ComplexCoderDescriptor extends CoderDescriptor {
     static Map<Pair<NType,NType>, ComplexCoderDescriptor> cache = new HashMap<Pair<NType,NType>, ComplexCoderDescriptor>();
-    static Set<MixedEncodingDescriptor> mixedEncodingDescriptors = new HashSet<MixedEncodingDescriptor>();
+    static Set<MixedEncodingDescriptor> mixedEncodingDescriptors = new TreeSet<MixedEncodingDescriptor>();
 
     public static Set<MixedEncodingDescriptor> getMixedEncoders() { return mixedEncodingDescriptors; }
 
@@ -76,7 +76,7 @@
     // ** Subclasses
     // -------------
 
-    public static class MixedEncodingDescriptor extends ComplexCoderDescriptor {
+    public static class MixedEncodingDescriptor extends ComplexCoderDescriptor implements java.lang.Comparable {
         protected final PrimitiveCoderDescriptor desc32;
 
         public MixedEncodingDescriptor(final PrimitiveCoderDescriptor desc32, final PrimitiveCoderDescriptor desc64) {
@@ -97,5 +97,6 @@
         }
 
         static String getBaseNameOfCoder(final String coderName) { return coderName.substring(0, coderName.indexOf("Coder")); }
+        public int compareTo(Object _o) { MixedEncodingDescriptor o = (MixedEncodingDescriptor)_o; return getMixedName().compareTo(o.getMixedName()); }
     }
 }