SWIG C ++ to Java - 包装枚举指针(通过引用传递)

时间:2015-11-09 16:00:31

标签: java enums pass-by-reference swig

我有一个像这样的ENUM变量。

enum FIO
{
   FIO_Error = 0,
   FIO_Error_1,
   FIO_Error_2
};

也是一个更改错误代码的函数:

void changeFIO (FIO_Error_Enum *errorCode)
{
    *errorCode = FIO_Error_2;
}

所以我的问题是这个。我知道SWIG在包装通过引用传递给函数的变量时会很痛苦。特别是现在我正在处理一个枚举类型的变量。

我知道我必须在代码界面中进行设置以便正确执行此操作,但我遇到了真正的问题。

1 个答案:

答案 0 :(得分:1)

%include <typemaps.i>

%define ENUM_OUTPUT_TYPEMAPS(TYPE, TYPENAME) 
%typemap(in) int *OUTPUT($*1_ltype temp), int &OUTPUT($*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 = (TYPE *)&temp; 
} 
%typemap(argout) int *OUTPUT, int &OUTPUT { 
   jint jvalue = (jint)temp$argnum; 
   JCALL4(SetIntArrayRegion, jenv, $input, 0, 1, &jvalue); 
} 

%typemap(javain, 
          pre= "    int[] temp$javainput = new int[1];", 
          post="      $javainput[0] = TYPE.swigToEnum(temp$javainput[0]);" 
         ) int *OUTPUT, int &OUTPUT "temp$javainput" 
%typemap(jni) int *OUTPUT, int &OUTPUT "jintArray" 
%typemap(jtype) int *OUTPUT, int &OUTPUT "int[]" 
%typemap(jstype) int *OUTPUT, int &OUTPUT "$*javaclassname[]" 

%apply int* OUTPUT {TYPE *TYPENAME, TYPE &TYPENAME}; 
%enddef 

ENUM_OUTPUT_TYPEMAPS(FIO_Error_Enum, errorCode);