-
Notifications
You must be signed in to change notification settings - Fork 63
Description
Building upon Issue #3, we expect JavaVM.GetValue() calls to be "buried" within binding code, not directly invoked by developers (most of the time). Thus, how does a developer tell a binding method that a new value should be created instead of retrieving a possibly shared value?
Introduce JniEnvironment.BeginGetValueScope(GetValueScope):
[Flags]
public enum GetValueBehaviors {
Default = 0,
CreateValues = 1,
DoNotMarshalExceptions = 2,
}
partial class JniEnvironment {
public static IDisposable BeginGetValueBehaviors (GetValueBehaviors scope);
}
Calling JniEnviornment.BeginGetValueBehaviors() would alter the behavior of JavaVM.GetValue(): if GetValueBehaviors.CreateValues is specified, then JavaVM.GetValue() will instead behave like JavaVM.CreateValue(). This allows the end user to maintain some degree of control:
using (var scope = JniEnvironment.BeginGetValueBehaviors (GetValueBehaviors.CreateValues))
using (var typeface = Typeface.Create (...)) {
// use typeface
}
The above allows disposing of the temporary with impunity, as BeginGetValueScope() will ensure that Typeface.Create() returns unique wrappers instead of possibly shared wrappers.