123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- /* -----------------------------------------------------------------------------
- * 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 passeed 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 ""
|