diff options
Diffstat (limited to 'src/java/com/jogamp/gluegen/CMethodBindingEmitter.java')
-rw-r--r-- | src/java/com/jogamp/gluegen/CMethodBindingEmitter.java | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java index 9c7ed0b..e20a1cb 100644 --- a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java +++ b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java @@ -1176,12 +1176,36 @@ public class CMethodBindingEmitter extends FunctionEmitter { unit.emitln(" */"); } } else if (javaType.isString()) { + final boolean pascalString = javaType.isPascalStringVariant(); + final String lenArgName; + if( pascalString ) { + final int lenIdx = cfg.pascalStringLengthIndex(getCSymbol(), argIdx); + lenArgName = 0 <= lenIdx ? binding.getArgumentName(lenIdx) : null; + } else { + lenArgName = null; + } if( addLocalVar ) { - unit.emit(" "+javaType.jniTypeName()+" "+javaArgName+" = "); + unit.emitln(" "+javaType.jniTypeName()+" "+javaArgName+";"); + } + if( null != lenArgName ) { + unit.emitln(" if (NULL == "+cArgName+" || 0 >= "+lenArgName+" ) {"); } else { - unit.emit(" "+javaArgName+" = "); + unit.emitln(" if (NULL == "+cArgName+") {"); + } + unit.emitln(" "+javaArgName+" = NULL;"); + unit.emitln(" } else {"); + if( null != lenArgName ) { + unit.emitln(" char* "+cArgName+"_cstr = calloc("+lenArgName+"+1, sizeof(char)); // PascalString -> Add EOS"); + unit.emitln(" memcpy("+cArgName+"_cstr, "+cArgName+", "+lenArgName+");"); } - unit.emitln("(NULL == "+cArgName+") ? NULL : (*env)->NewStringUTF(env, (const char *)"+cArgName+");"); + unit.emit (" "+javaArgName+" = "); + if( null != lenArgName ) { + unit.emitln("(*env)->NewStringUTF(env, (const char *)"+cArgName+"_cstr);"); + unit.emitln(" free("+cArgName+"_cstr);"); + } else { + unit.emitln("(*env)->NewStringUTF(env, (const char *)"+cArgName+");"); + } + unit.emitln(" }"); } else if (javaType.isArrayOfCompoundTypeWrappers() || ( javaType.isArray() && javaType.isNIOByteBufferArray() ) ) { |