Package com.jogamp.gluegen
Class JavaEmitter
- java.lang.Object
-
- com.jogamp.gluegen.JavaEmitter
-
- All Implemented Interfaces:
GlueEmitter
- Direct Known Subclasses:
CStructAnnotationProcessor.AnnotationProcessorJavaStructEmitter
,ProcAddressEmitter
public class JavaEmitter extends Object implements GlueEmitter
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
JavaEmitter.EmissionStyle
Style of code emission.static class
JavaEmitter.MethodAccess
Access control for emitted Java methods.
-
Field Summary
Fields Modifier and Type Field Description protected JavaConfiguration
cfg
protected Logging.LoggerIf
LOG
-
Constructor Summary
Constructors Constructor Description JavaEmitter()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static int
addStrings2Buffer(StringBuilder buf, String sep, String first, Collection<String> col)
void
beginDefines()
void
beginEmission(GlueEmitterControls controls)
Begin the emission of glue code.void
beginFunctions(TypeDictionary typedefDictionary, TypeDictionary structDictionary, Map<Type,Type> canonMap)
void
beginStructLayout()
Begins the process of computing field offsets and type sizes for the structs to be emitted.void
beginStructs(TypeDictionary typedefDictionary, TypeDictionary structDictionary, Map<Type,Type> canonMap)
protected String
cFileName()
For#cImplWriter
protected JavaConfiguration
createConfig()
Create the object that will read and store configuration information for this JavaEmitter.protected PrintWriter
cWriter()
protected void
emitAllFileFooters()
Write out any footer information for the output files (closing brace of class definition, etc).protected void
emitAllFileHeaders()
Write out any header information for the output files (class declaration and opening brace, import statements, etc).protected void
emitCHeader(PrintWriter cWriter, String packageName, String className)
protected void
emitCInitCode(PrintWriter cWriter, String packageName, String className)
protected void
emitCustomJavaCode(PrintWriter writer, String className)
Emit all the strings specified in the "CustomJavaCode" parameters of the configuration file.void
emitDefine(ConstantDefinition def, String optionalComment)
Iterator<FunctionSymbol>
emitFunctions(List<FunctionSymbol> funcsToBind)
Emit glue code for the list of FunctionSymbols.protected void
emitJavaInitCode(PrintWriter jWriter, String className)
void
emitStruct(CompoundType structCType, Type structCTypedefPtr)
Emit glue code for the given CompoundType.void
endDefines()
void
endEmission()
Finish the emission of glue code.void
endFunctions()
void
endStructLayout()
Finishes the struct layout process.void
endStructs()
protected List<MethodBinding>
expandMethodBinding(MethodBinding binding)
protected List<? extends FunctionEmitter>
generateMethodBindingEmitters(FunctionSymbol sym)
Generate all appropriate Java bindings for the specified C function symbols.protected void
generatePrivateEmitters(MethodBinding binding, List<FunctionEmitter> allEmitters)
Generates the private emitters for this MethodBinding.protected void
generatePublicEmitters(MethodBinding binding, List<FunctionEmitter> allEmitters, boolean signatureOnly)
Generates the public emitters for this MethodBinding which will produce either simply signatures (for the interface class, if any) or function definitions with or without a body (depending on whether or not the implementing function can go directly to native code because it doesn't need any processing of the outgoing arguments).String[]
getClassAccessModifiers(String classFQName)
protected JavaConfiguration
getConfig()
Get the configuration information for this JavaEmitter.JavaConfiguration
getConfiguration()
protected String
getImplPackageName()
Returns the value that was specified by the configuration directive "ImplPackage", or the default if none was specified.protected String
getJavaOutputDir()
Returns the value that was specified by the configuration directive "JavaOutputDir", or the default if none was specified.protected String
getJavaPackageName()
Returns the value that was specified by the configuration directive "Package", or the default if none was specified.protected static String
getJNIMethodNamePrefix(String javaPackageName, String javaClassName)
Returns the JNI method prefix consisting our of mangled package- and class-nameprotected String
javaFileName()
ForjavaWriter
orjavaImplWriter
protected PrintWriter
javaImplWriter()
protected PrintWriter
javaWriter()
protected static String
jniMangle(String name)
Mangle a class, package or function name for JNI usage, i.e.void
layoutStruct(CompoundType t)
Lays out one struct which will be emitted later.protected void
mangleBinding(MethodBinding binding)
Allow specializations to modify the givenMethodBinding
beforeexpanding
and emission.protected PrintWriter
openFile(String filename, String simpleClassName)
protected void
prepCEmitter(String returnSizeLookupName, JavaType javaReturnType, CMethodBindingEmitter cEmitter)
void
readConfigurationFile(String filename)
protected boolean
requiresStaticInitialization(String clazzName)
Returnstrue
if implementation (java and native-code) requiresstaticClassInitCodeCCode
andstaticClassInitCallJavaCode
and haveinitializeImpl()
being called at static class initialization.
-
-
-
Field Detail
-
cfg
protected JavaConfiguration cfg
-
LOG
protected final Logging.LoggerIf LOG
-
-
Method Detail
-
readConfigurationFile
public void readConfigurationFile(String filename) throws Exception
- Specified by:
readConfigurationFile
in interfaceGlueEmitter
- Throws:
Exception
-
getConfiguration
public JavaConfiguration getConfiguration()
- Specified by:
getConfiguration
in interfaceGlueEmitter
-
beginEmission
public void beginEmission(GlueEmitterControls controls) throws IOException
Description copied from interface:GlueEmitter
Begin the emission of glue code. This might include opening files, emitting class headers, etc.- Specified by:
beginEmission
in interfaceGlueEmitter
- Throws:
IOException
-
endEmission
public void endEmission()
Description copied from interface:GlueEmitter
Finish the emission of glue code. This might include closing files, closing open class definitions, etc.- Specified by:
endEmission
in interfaceGlueEmitter
-
beginDefines
public void beginDefines() throws Exception
- Specified by:
beginDefines
in interfaceGlueEmitter
- Throws:
Exception
-
jniMangle
protected static String jniMangle(String name)
Mangle a class, package or function name for JNI usage, i.e. replace all '.' w/ '_'
-
getJNIMethodNamePrefix
protected static String getJNIMethodNamePrefix(String javaPackageName, String javaClassName)
Returns the JNI method prefix consisting our of mangled package- and class-name
-
emitDefine
public void emitDefine(ConstantDefinition def, String optionalComment) throws Exception
- Specified by:
emitDefine
in interfaceGlueEmitter
optionalComment
- If optionalComment is non-null, the emitter can emit that string as a comment providing extra information about the define.- Throws:
Exception
-
endDefines
public void endDefines() throws Exception
- Specified by:
endDefines
in interfaceGlueEmitter
- Throws:
Exception
-
beginFunctions
public void beginFunctions(TypeDictionary typedefDictionary, TypeDictionary structDictionary, Map<Type,Type> canonMap) throws Exception
- Specified by:
beginFunctions
in interfaceGlueEmitter
- Throws:
Exception
-
emitFunctions
public Iterator<FunctionSymbol> emitFunctions(List<FunctionSymbol> funcsToBind) throws Exception
Description copied from interface:GlueEmitter
Emit glue code for the list of FunctionSymbols.- Specified by:
emitFunctions
in interfaceGlueEmitter
- Throws:
Exception
-
createConfig
protected JavaConfiguration createConfig()
Create the object that will read and store configuration information for this JavaEmitter.
-
getConfig
protected JavaConfiguration getConfig()
Get the configuration information for this JavaEmitter.
-
requiresStaticInitialization
protected final boolean requiresStaticInitialization(String clazzName)
Returnstrue
if implementation (java and native-code) requiresstaticClassInitCodeCCode
andstaticClassInitCallJavaCode
and haveinitializeImpl()
being called at static class initialization.This is currently true, if one of the following method returns
true
-
generatePublicEmitters
protected void generatePublicEmitters(MethodBinding binding, List<FunctionEmitter> allEmitters, boolean signatureOnly)
Generates the public emitters for this MethodBinding which will produce either simply signatures (for the interface class, if any) or function definitions with or without a body (depending on whether or not the implementing function can go directly to native code because it doesn't need any processing of the outgoing arguments).
-
generatePrivateEmitters
protected void generatePrivateEmitters(MethodBinding binding, List<FunctionEmitter> allEmitters)
Generates the private emitters for this MethodBinding. On the Java side these will simply produce signatures for native methods. On the C side these will create the emitters which will write the JNI code to interface to the functions. We need to be careful to make the signatures all match up and not produce too many emitters which would lead to compilation errors from creating duplicated methods / functions.
-
prepCEmitter
protected void prepCEmitter(String returnSizeLookupName, JavaType javaReturnType, CMethodBindingEmitter cEmitter)
-
generateMethodBindingEmitters
protected List<? extends FunctionEmitter> generateMethodBindingEmitters(FunctionSymbol sym) throws Exception
Generate all appropriate Java bindings for the specified C function symbols.- Throws:
Exception
-
endFunctions
public void endFunctions() throws Exception
- Specified by:
endFunctions
in interfaceGlueEmitter
- Throws:
Exception
-
beginStructLayout
public void beginStructLayout() throws Exception
Description copied from interface:GlueEmitter
Begins the process of computing field offsets and type sizes for the structs to be emitted.- Specified by:
beginStructLayout
in interfaceGlueEmitter
- Throws:
Exception
-
layoutStruct
public void layoutStruct(CompoundType t) throws Exception
Description copied from interface:GlueEmitter
Lays out one struct which will be emitted later.- Specified by:
layoutStruct
in interfaceGlueEmitter
- Throws:
Exception
-
endStructLayout
public void endStructLayout() throws Exception
Description copied from interface:GlueEmitter
Finishes the struct layout process.- Specified by:
endStructLayout
in interfaceGlueEmitter
- Throws:
Exception
-
beginStructs
public void beginStructs(TypeDictionary typedefDictionary, TypeDictionary structDictionary, Map<Type,Type> canonMap) throws Exception
- Specified by:
beginStructs
in interfaceGlueEmitter
- Throws:
Exception
-
emitStruct
public void emitStruct(CompoundType structCType, Type structCTypedefPtr) throws Exception
Description copied from interface:GlueEmitter
Emit glue code for the given CompoundType. typedefType is provided when the CompoundType (e.g. "struct foo_t") has not been typedefed to anything but the type of "pointer to struct foo_t" has (e.g. "typedef struct foo_t {} *Foo"); in this case typedefType would be set to pointer type Foo.- Specified by:
emitStruct
in interfaceGlueEmitter
- Throws:
Exception
-
endStructs
public void endStructs() throws Exception
- Specified by:
endStructs
in interfaceGlueEmitter
- Throws:
Exception
-
addStrings2Buffer
public static int addStrings2Buffer(StringBuilder buf, String sep, String first, Collection<String> col)
-
openFile
protected PrintWriter openFile(String filename, String simpleClassName) throws IOException
- Parameters:
filename
- the class's full filename to open w/ write accesssimpleClassName
- the simple class name, i.e. w/o package name- Returns:
- a
PrintWriter
instance to write the class source file ornull
to suppress output! - Throws:
IOException
-
javaFileName
protected String javaFileName()
ForjavaWriter
orjavaImplWriter
-
javaWriter
protected PrintWriter javaWriter()
-
javaImplWriter
protected PrintWriter javaImplWriter()
-
cFileName
protected String cFileName()
For#cImplWriter
-
cWriter
protected PrintWriter cWriter()
-
getJavaOutputDir
protected String getJavaOutputDir()
Returns the value that was specified by the configuration directive "JavaOutputDir", or the default if none was specified.
-
getJavaPackageName
protected String getJavaPackageName()
Returns the value that was specified by the configuration directive "Package", or the default if none was specified.
-
getImplPackageName
protected String getImplPackageName()
Returns the value that was specified by the configuration directive "ImplPackage", or the default if none was specified.
-
emitCustomJavaCode
protected void emitCustomJavaCode(PrintWriter writer, String className) throws Exception
Emit all the strings specified in the "CustomJavaCode" parameters of the configuration file.- Throws:
Exception
-
emitAllFileHeaders
protected void emitAllFileHeaders() throws IOException
Write out any header information for the output files (class declaration and opening brace, import statements, etc).- Throws:
IOException
-
emitCHeader
protected void emitCHeader(PrintWriter cWriter, String packageName, String className)
-
emitCInitCode
protected void emitCInitCode(PrintWriter cWriter, String packageName, String className)
-
emitJavaInitCode
protected void emitJavaInitCode(PrintWriter jWriter, String className)
-
emitAllFileFooters
protected void emitAllFileFooters()
Write out any footer information for the output files (closing brace of class definition, etc).
-
mangleBinding
protected void mangleBinding(MethodBinding binding)
Allow specializations to modify the givenMethodBinding
beforeexpanding
and emission.
-
expandMethodBinding
protected List<MethodBinding> expandMethodBinding(MethodBinding binding)
-
-