自定义swig生成的代码

时间:2012-10-11 16:58:50

标签: java java-native-interface swig

是否可以修改swig生成的代码? 我想替换swig生成的代码。例如

我有结构

typedef struct Test {
  char *buffer;
} Test;

Swig将创建以下代码

SWIGEXPORT void JNICALL Java_Test_1buffer_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) {
  struct Test *arg1 = (struct Test *) 0 ;
  char *arg2 = (char *) 0 ;

  (void)jenv;
  (void)jcls;
  (void)jarg1_;
  arg1 = (struct Test*)&jarg1; 
  arg2 = 0;
  {
    if (arg2) {
      arg1->buffer= (char const *) malloc(strlen((const char *)arg2)+1);
      strcpy((char *)arg1->buffer, (const char *)arg2);
    } else {
      arg1->buffer= 0;
    }
  }
  if (arg2) (*jenv)->ReleaseStringUTFChars(jenv, jarg2, (const char *)arg2);
}

是否可以将strcpy替换为其他功能customized_strcpy

1 个答案:

答案 0 :(得分:2)

memberin typemap负责您显示的代码。您可以通过编写自定义类型映射来替换strcpy。例如:

%module example

%typemap(memberin) char *buffer {
  // Keep whatever other bits of the mechanics you care about 
  if ($1) free($1);
  if ($input) {
    $1 = malloc(strlen($input)+1);
    customized_strcpy($1, $input);
  } else {
    $1 = 0;
  }
}

%inline %{
typedef struct Test {
  char *buffer;
} Test;
%}

生成您想要的代码。

相关问题