| /* ----------------------------------------------------------------------------- | |
| * various.i | |
| * | |
| * SWIG Typemap library for Java. | |
| * Various useful typemaps. | |
| * ----------------------------------------------------------------------------- */ | |
| /* | |
| * char **STRING_ARRAY typemaps. | |
| * These typemaps are for C String arrays which are NULL terminated. | |
| * char *values[] = { "one", "two", "three", NULL }; // note NULL | |
| * char ** is mapped to a Java String[]. | |
| * | |
| * Example usage wrapping: | |
| * %apply char **STRING_ARRAY { char **input }; | |
| * char ** foo(char **input); | |
| * | |
| * Java usage: | |
| * String numbers[] = { "one", "two", "three" }; | |
| * String[] ret = modulename.foo( numbers }; | |
| */ | |
| %typemap(jni) char **STRING_ARRAY "jobjectArray" | |
| %typemap(jtype) char **STRING_ARRAY "String[]" | |
| %typemap(jstype) char **STRING_ARRAY "String[]" | |
| %typemap(in) char **STRING_ARRAY (jint size) { | |
| int i = 0; | |
| if ($input) { | |
| size = JCALL1(GetArrayLength, jenv, $input); | |
| #ifdef __cplusplus | |
| $1 = new char*[size+1]; | |
| #else | |
| $1 = (char **)malloc((size+1) * sizeof(char *)); | |
| #endif | |
| for (i = 0; i<size; i++) { | |
| jstring j_string = (jstring)JCALL2(GetObjectArrayElement, jenv, $input, i); | |
| const char *c_string = JCALL2(GetStringUTFChars, jenv, j_string, 0); | |
| #ifdef __cplusplus | |
| $1[i] = new char [strlen(c_string)+1]; | |
| #else | |
| $1[i] = (char *)malloc((strlen(c_string)+1) * sizeof(const char *)); | |
| #endif | |
| strcpy($1[i], c_string); | |
| JCALL2(ReleaseStringUTFChars, jenv, j_string, c_string); | |
| JCALL1(DeleteLocalRef, jenv, j_string); | |
| } | |
| $1[i] = 0; | |
| } else { | |
| $1 = 0; | |
| size = 0; | |
| } | |
| } | |
| %typemap(freearg) char **STRING_ARRAY { | |
| int i; | |
| for (i=0; i<size$argnum; i++) | |
| #ifdef __cplusplus | |
| delete[] $1[i]; | |
| delete[] $1; | |
| #else | |
| free($1[i]); | |
| free($1); | |
| #endif | |
| } | |
| %typemap(out) char **STRING_ARRAY { | |
| if ($1) { | |
| int i; | |
| jsize len=0; | |
| jstring temp_string; | |
| const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String"); | |
| while ($1[len]) len++; | |
| $result = JCALL3(NewObjectArray, jenv, len, clazz, NULL); | |
| /* exception checking omitted */ | |
| for (i=0; i<len; i++) { | |
| temp_string = JCALL1(NewStringUTF, jenv, *$1++); | |
| JCALL3(SetObjectArrayElement, jenv, $result, i, temp_string); | |
| JCALL1(DeleteLocalRef, jenv, temp_string); | |
| } | |
| } | |
| } | |
| %typemap(javain) char **STRING_ARRAY "$javainput" | |
| %typemap(javaout) char **STRING_ARRAY { | |
| return $jnicall; | |
| } | |
| /* | |
| * char **STRING_OUT typemaps. | |
| * These are typemaps for returning strings when using a C char ** parameter type. | |
| * The returned string appears in the 1st element of the passed in Java String array. | |
| * | |
| * Example usage wrapping: | |
| * %apply char **STRING_OUT { char **string_out }; | |
| * void foo(char **string_out); | |
| * | |
| * Java usage: | |
| * String stringOutArray[] = { "" }; | |
| * modulename.foo(stringOutArray); | |
| * System.out.println( stringOutArray[0] ); | |
| */ | |
| %typemap(jni) char **STRING_OUT "jobjectArray" | |
| %typemap(jtype) char **STRING_OUT "String[]" | |
| %typemap(jstype) char **STRING_OUT "String[]" | |
| %typemap(javain) char **STRING_OUT "$javainput" | |
| %typemap(in) char **STRING_OUT($*1_ltype temp) { | |
| if (!$input) { | |
| SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); | |
| return $null; | |
| } | |
| if (JCALL1(GetArrayLength, jenv, $input) == 0) { | |
| SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); | |
| return $null; | |
| } | |
| $1 = &temp; | |
| *$1 = 0; | |
| } | |
| %typemap(argout) char **STRING_OUT { | |
| jstring jnewstring = NULL; | |
| if ($1) { | |
| jnewstring = JCALL1(NewStringUTF, jenv, *$1); | |
| } | |
| JCALL3(SetObjectArrayElement, jenv, $input, 0, jnewstring); | |
| } | |
| /* | |
| * char *BYTE typemaps. | |
| * These are input typemaps for mapping a Java byte[] array to a C char array. | |
| * Note that as a Java array is used and thus passed by reference, the C routine | |
| * can return data to Java via the parameter. | |
| * | |
| * Example usage wrapping: | |
| * void foo(char *array); | |
| * | |
| * Java usage: | |
| * byte b[] = new byte[20]; | |
| * modulename.foo(b); | |
| */ | |
| %typemap(jni) char *BYTE "jbyteArray" | |
| %typemap(jtype) char *BYTE "byte[]" | |
| %typemap(jstype) char *BYTE "byte[]" | |
| %typemap(in) char *BYTE { | |
| $1 = (char *) JCALL2(GetByteArrayElements, jenv, $input, 0); | |
| } | |
| %typemap(argout) char *BYTE { | |
| JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *) $1, 0); | |
| } | |
| %typemap(javain) char *BYTE "$javainput" | |
| /* Prevent default freearg typemap from being used */ | |
| %typemap(freearg) char *BYTE "" | |
| /* | |
| * unsigned char *NIOBUFFER typemaps. | |
| * This is for mapping Java nio buffers to C char arrays. | |
| * It is useful for performance critical code as it reduces the memory copy an marshaling overhead. | |
| * Note: The Java buffer has to be allocated with allocateDirect. | |
| * | |
| * Example usage wrapping: | |
| * %apply unsigned char *NIOBUFFER { unsigned char *buf }; | |
| * void foo(unsigned char *buf); | |
| * | |
| * Java usage: | |
| * java.nio.ByteBuffer b = ByteBuffer.allocateDirect(20); | |
| * modulename.foo(b); | |
| */ | |
| %typemap(jni) unsigned char *NIOBUFFER "jobject" | |
| %typemap(jtype) unsigned char *NIOBUFFER "java.nio.ByteBuffer" | |
| %typemap(jstype) unsigned char *NIOBUFFER "java.nio.ByteBuffer" | |
| %typemap(javain, | |
| pre=" assert $javainput.isDirect() : \"Buffer must be allocated direct.\";") unsigned char *NIOBUFFER "$javainput" | |
| %typemap(javaout) unsigned char *NIOBUFFER { | |
| return $jnicall; | |
| } | |
| %typemap(in) unsigned char *NIOBUFFER { | |
| $1 = (unsigned char *) JCALL1(GetDirectBufferAddress, jenv, $input); | |
| if ($1 == NULL) { | |
| SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "Unable to get address of a java.nio.ByteBuffer direct byte buffer. Buffer must be a direct buffer and not a non-direct buffer."); | |
| } | |
| } | |
| %typemap(memberin) unsigned char *NIOBUFFER { | |
| if ($input) { | |
| $1 = $input; | |
| } else { | |
| $1 = 0; | |
| } | |
| } | |
| %typemap(freearg) unsigned char *NIOBUFFER "" | |