def transform_to_c(self): if self.transfer_ownership: tmp = self.c_name + '_tmp' return TypeTransform([ C.Decl(self.c_type, self.c_name), C.Decl(self.c_type, tmp), ], [ C.IfElse(ifs=[self.jni_name], bodies=[[ C.Assign(tmp, C.Env('GetStringUTFChars', self.jni_name, 'NULL'), cast=self.c_type), C.ExceptionCheck.default(self), C.Assign(self.c_name, C.Call('g_strdup', tmp)), ], [ C.Assign(self.c_name, 'NULL'), ]]) ], [ C.If(self.jni_name, C.Env('ReleaseStringUTFChars', self.jni_name, tmp)), ]) else: return TypeTransform([ C.Decl(self.c_type, self.c_name), ], [ C.IfElse(ifs=[self.jni_name], bodies=[[ C.Assign(self.c_name, C.Env('GetStringUTFChars', self.jni_name, 'NULL'), cast=self.c_type), C.ExceptionCheck.default(self), ], [ C.Assign(self.c_name, 'NULL'), ]]), ], [ C.If( self.jni_name, C.Env('ReleaseStringUTFChars', self.jni_name, self.c_name)), ])
def transform_to_jni(self): it = self.c_name + '_it' inner_transforms = super(GHashTableType, self).transform_to_jni() return TypeTransform([ C.Decl(self.jni_type, self.jni_name), C.Decl('GHashTableIter', it), C.Decl(self.inner_key.c_type, self.inner_key.c_name), C.Decl(self.inner_value.c_type, self.inner_value.c_name), inner_transforms.declarations, ], [ C.Assign(self.jni_name, 'NULL'), C.If(self.c_name, [ C.Assign(self.jni_name, C.Env.new('HashMap')), C.ExceptionCheck.default(self), C.Call('g_hash_table_iter_init', '&' + it, self.c_name), C.While( C.Call('g_hash_table_iter_next', '&' + it, '(void **) &' + self.inner_key.c_name, '(void **) &' + self.inner_value.c_name), inner_transforms.conversion, C.Env.method(self.jni_name, ('HashMap', 'put'), self.inner_key.jni_name, self.inner_value.jni_name), C.ExceptionCheck.default(self), C.Env('DeleteLocalRef', self.inner_key.jni_name) if self.inner_value.has_local_ref else [], C.Env('DeleteLocalRef', self.inner_value.jni_name) if self.inner_value.has_local_ref else [], inner_transforms.cleanup, ), ]), ], self.transfer_ownership and [ C.If(self.c_name, [ C.Call('g_hash_table_unref', self.c_name), ]), ])
def transform_to_jni(self): get = None if self.transfer_ownership: get = '((JObjectCallbackWrapper*) %s)->wrapper->obj;' % self.c_name else: get = '((JObjectWrapper*) %s)->obj;' % self.c_name return TypeTransform([ C.Decl(self.jni_type, self.jni_name), ], [ C.Assign(self.jni_name, get), ], self.transfer_ownership and [ C.If( '((JObjectCallbackWrapper *) %s)->should_destroy' % self.c_name, C.Helper('jobject_callback_wrapper_destroy', self.c_name), ), ])
C.Helper.add_helper( 'gobject_to_jobject', C.Function( 'gobject_to_jobject', return_type='jobject', params=[ 'JNIEnv* env', 'gpointer data_pointer', 'jclass clazz', 'gboolean take_ref' ], body=[ C.Decl('GObject*', 'gobj'), C.Decl('JObjectWrapper*', 'wrapper'), '', C.If('!data_pointer', C.Log.debug('got jobject[NULL] from GObject[null]'), C.Return('NULL')), C.Assign('gobj', C.Call('G_OBJECT', 'data_pointer')), '', C.Assign('wrapper', C.Call('g_object_get_data', 'gobj', '"java_instance"'), cast='JObjectWrapper*'), C.IfElse( ifs=['wrapper'], bodies=[[ C.Log.debug('got jobject[%p] from gobject[%p]', 'wrapper->obj', 'gobj'), C.Return('wrapper->obj'), ], [ C.Decl('jobject', 'jobj'),
C.Helper('jobject_wrapper_destroy', 'data_pointer', 'FALSE'), ])) C.Helper.add_helper( 'gobject_to_jobject', C.Function( 'gobject_to_jobject', return_type='jobject', params=['JNIEnv* env', 'gpointer data_pointer', 'gboolean take_ref'], body=[ C.Decl('GObject*', 'gobj'), C.Decl('JObjectWrapper*', 'wrapper'), '', C.If('!data_pointer', C.Log.verbose('got jobject[NULL] from GObject[null]'), C.Return('NULL')), C.Assign('gobj', C.Call('G_OBJECT', 'data_pointer')), '', C.Assign('wrapper', C.Call('g_object_get_data', 'gobj', '"java_instance"'), cast='JObjectWrapper*'), C.IfElse( ifs=['wrapper'], bodies=[ [ C.Log.verbose('got jobject[%p] from gobject[%p]', 'wrapper->obj', 'gobj'), C.Return('wrapper->obj'), ], [