感谢托马斯的正确指导。解决方案是创建一个使用StringBuffer的自定义类型映射,以将结果返回。我
examples/java/typemap在SWIG安装目录中找到了代码。在搜索之前,我一定忽略了这一点。
我已在下面附加了示例代码,目前正在使用建议的替代方法。但是,使用BYTE类型映射的第一种方法可能需要对Java代码进行一些更改,但从长远来看实际上可能更有意义。
感谢您的帮助,现在我可以看看我是否可以接受自己的答案…
%module example%{void f1(char *s) { if(s != NULL) { sprintf(s, "hello world"); }}void f2(char *s) { f1(s);}void f3(char *s) { f1(s);}%}void f1(char *s);%include various.ivoid f2(char *BYTE);%typemap(jni) char *SBUF "jobject"%typemap(jtype) char *SBUF "StringBuffer"%typemap(jstype) char *SBUF "StringBuffer"%typemap(in) char *SBUF { $1 = NULL; if($input != NULL) { 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); const char *pCharStr = (*jenv)->GetStringUTFChars(jenv, js, 0); jmethodID capacityID = (*jenv)->GetMethodID(jenv, sbufClass, "capacity", "()I"); jint capacity = (*jenv)->CallIntMethod(jenv, $input, capacityID); $1 = (char *) malloc(capacity+1); strcpy($1, pCharStr); (*jenv)->ReleaseStringUTFChars(jenv, js, pCharStr); setLengthID = (*jenv)->GetMethodID(jenv, sbufClass, "setLength", "(I)V"); (*jenv)->CallVoidMethod(jenv, $input, setLengthID, (jint) 0); }}%typemap(argout) char *SBUF { if($1 != NULL) { 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); free($1); $1 = NULL; } }%typemap(freearg) char *SBUF ""%typemap(javain) char *SBUF "$javainput"void f3(char *SBUF);


