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.static class
JavaEmitter.Ownership
Resource ownership.
-
Field Summary
Fields Modifier and Type Field Description protected JavaConfiguration
cfg
protected Logging.LoggerIf
LOG
-
Constructor Summary
Constructors Constructor Description JavaEmitter()
JavaEmitter(JavaConfiguration cfg)
-
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, List<FunctionSymbol> cFunctions)
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 JavaConfiguration
createConfig()
Create the object that will read and store configuration information for this JavaEmitter.protected CCodeUnit
cUnit()
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
emitCustomJavaCode(CodeUnit unit, String className)
Emit all the strings specified in the "CustomJavaCode" parameters of the configuration file.protected void
emitCustomJNICode(CodeUnit unit, String className)
Emit all the strings specified in the "CustomJNICode" 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.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)
JavaConfiguration
getConfig()
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 JavaCodeUnit
javaImplUnit()
protected JavaCodeUnit
javaUnit()
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 CCodeUnit
openCUnit(String filename, String cUnitName)
protected JavaCodeUnit
openJavaUnit(String filename, String packageName, String simpleClassName)
protected void
prepCEmitter(String returnSizeLookupName, JavaType javaReturnType, CMethodBindingEmitter cEmitter)
void
readConfigurationFile(String filename)
-
-
-
Field Detail
-
cfg
protected JavaConfiguration cfg
-
LOG
protected final Logging.LoggerIf LOG
-
-
Constructor Detail
-
JavaEmitter
public JavaEmitter()
-
JavaEmitter
public JavaEmitter(JavaConfiguration cfg)
-
-
Method Detail
-
readConfigurationFile
public void readConfigurationFile(String filename) throws Exception
- Specified by:
readConfigurationFile
in interfaceGlueEmitter
- Throws:
Exception
-
getConfig
public JavaConfiguration getConfig()
- Specified by:
getConfig
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, List<FunctionSymbol> cFunctions) 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.
-
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)
-
openCUnit
protected CCodeUnit openCUnit(String filename, String cUnitName) throws IOException
- Parameters:
filename
- the class's full filename to open w/ write accesscUnitName
- the base c-unit name, i.e. c-file basename with suffixgenerator
- informal optional object that is creating this unit, used to be mentioned in a warning message if not null.- Throws:
IOException
-
openJavaUnit
protected JavaCodeUnit openJavaUnit(String filename, String packageName, String simpleClassName) throws IOException
- Parameters:
filename
- the class's full filename to open w/ write accesspackageName
- the package name of the classsimpleClassName
- the simple class name, i.e. w/o package name or c-file basenamegenerator
- informal optional object that is creating this unit, used to be mentioned in a warning message if not null.- Throws:
IOException
-
javaUnit
protected JavaCodeUnit javaUnit()
-
javaImplUnit
protected JavaCodeUnit javaImplUnit()
-
cUnit
protected CCodeUnit cUnit()
-
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(CodeUnit unit, String className) throws Exception
Emit all the strings specified in the "CustomJavaCode" parameters of the configuration file.- Throws:
Exception
-
emitCustomJNICode
protected void emitCustomJNICode(CodeUnit unit, String className) throws Exception
Emit all the strings specified in the "CustomJNICode" 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
-
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)
-
-