blob: 00921b4cb0fde60babab57acf6aca4d6f6032125 [file] [log] [blame]
/* File : example.i */
%module example
%{
/* Put headers and other declarations here */
/*
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, besides java cannot return
a value in a string argument
*/
void f1(char *s);
%include typemaps.i
/* use the BYTE typemap to get around this, but the resulting code is ugly */
void f2(char *BYTE);
/* make a StringBuffer typemap to handle this case */
/* what type to use in java source code */
%typemap(java,jtype) char *SBUF {StringBuffer}
/* what is the corresponding jni type */
%typemap(java,jni) char *SBUF {jobject}
/* how to convert java type to requested c type */
%typemap(java,in) char *SBUF {
jclass sbufClass;
jmethodID toStringID;
jmethodID setLengthID;
jstring js;
$target = NULL;
if($source != NULL) {
/* get the String from the StringBuffer */
sbufClass = (*jenv)->GetObjectClass(jenv, $source);
toStringID = (*jenv)->GetMethodID(jenv, sbufClass, "toString", "()Ljava/lang/String;");
js = (jstring) (*jenv)->CallObjectMethod(jenv, $source, toStringID);
/* convert the String to a char * */
$target = (char *)(*jenv)->GetStringUTFChars(jenv, js, 0);
/* zero the original StringBuffer, so we can replace it with the result */
setLengthID = (*jenv)->GetMethodID(jenv, sbufClass, "setLength", "(I)V");
(*jenv)->CallVoidMethod(jenv, $source, setLengthID, (jint) 0);
}
}
/* how to convert the c type to the java type */
%typemap(java,argout) char *SBUF {
jclass sbufClass;
jmethodID appendStringID;
if($target != NULL) {
/* append the result to the empty StringBuffer */
sbufClass = (*jenv)->GetObjectClass(jenv, $source);
appendStringID = (*jenv)->GetMethodID(jenv, sbufClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
(*jenv)->CallObjectMethod(jenv, $source, appendStringID, (*jenv)->NewStringUTF(jenv, $target));
if($source != NULL) (*jenv)->ReleaseStringUTFChars(jenv, $source, $target);
}
}
/* apply the new typemap to our function */
void f3(char *SBUF);