/trunk/Examples/java/typemap/example.i
Swig | 101 lines | 50 code | 23 blank | 28 comment | 0 complexity | a3f47a1771ee7452e497596747586d1d MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- /* File : example.i */
- %module example
- %{
- /*
- example of a function that returns a value in the char * argument
- normally used like:
- char buf[bigenough];
- f1(buf);
- */
- void f1(char *s) {
- if(s != NULL) {
- sprintf(s, "hello world");
- }
- }
- void f2(char *s) {
- f1(s);
- }
- void f3(char *s) {
- f1(s);
- }
- %}
- /* default behaviour is that of input arg, Java cannot return a value in a
- * string argument, so any changes made by f1(char*) will not be seen in the Java
- * string passed to the f1 function.
- */
- void f1(char *s);
- %include various.i
- /* use the BYTE argout typemap to get around this. Changes in the string by
- * f2 can be seen in Java. */
- void f2(char *BYTE);
- /* Alternative approach uses a StringBuffer typemap for argout */
- /* Define the types to use in the generated JNI C code and Java code */
- %typemap(jni) char *SBUF "jobject"
- %typemap(jtype) char *SBUF "StringBuffer"
- %typemap(jstype) char *SBUF "StringBuffer"
- /* How to convert Java(JNI) type to requested C type */
- %typemap(in) char *SBUF {
- $1 = NULL;
- if($input != NULL) {
- /* Get the String from the StringBuffer */
- jmethodID setLengthID;
- jclass sbufClass = (*jenv)->GetObjectClass(jenv, $input);
- jmethodID toStringID = (*jenv)->GetMethodID(jenv, sbufClass, "toString", "()Ljava/lang/String;");
- jstring js = (jstring) (*jenv)->CallObjectMethod(jenv, $input, toStringID);
- /* Convert the String to a C string */
- const char *pCharStr = (*jenv)->GetStringUTFChars(jenv, js, 0);
- /* Take a copy of the C string as the typemap is for a non const C string */
- jmethodID capacityID = (*jenv)->GetMethodID(jenv, sbufClass, "capacity", "()I");
- jint capacity = (*jenv)->CallIntMethod(jenv, $input, capacityID);
- $1 = (char *) malloc(capacity+1);
- strcpy($1, pCharStr);
- /* Release the UTF string we obtained with GetStringUTFChars */
- (*jenv)->ReleaseStringUTFChars(jenv, js, pCharStr);
- /* Zero the original StringBuffer, so we can replace it with the result */
- setLengthID = (*jenv)->GetMethodID(jenv, sbufClass, "setLength", "(I)V");
- (*jenv)->CallVoidMethod(jenv, $input, setLengthID, (jint) 0);
- }
- }
- /* How to convert the C type to the Java(JNI) type */
- %typemap(argout) char *SBUF {
- if($1 != NULL) {
- /* Append the result to the empty StringBuffer */
- jstring newString = (*jenv)->NewStringUTF(jenv, $1);
- jclass sbufClass = (*jenv)->GetObjectClass(jenv, $input);
- jmethodID appendStringID = (*jenv)->GetMethodID(jenv, sbufClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
- (*jenv)->CallObjectMethod(jenv, $input, appendStringID, newString);
- /* Clean up the string object, no longer needed */
- free($1);
- $1 = NULL;
- }
- }
- /* Prevent the default freearg typemap from being used */
- %typemap(freearg) char *SBUF ""
- /* Convert the jstype to jtype typemap type */
- %typemap(javain) char *SBUF "$javainput"
- /* apply the new typemap to our function */
- void f3(char *SBUF);