swig typemap для результата функции C ++

0

У меня есть эта структура

struct License
{
    time_t creationTime;
        ...
};

Я хочу преобразовать time_t в java.util.Calendar.

%typemap(jni) time_t "jobject"
%typemap(jtype) time_t "java.util.Calendar"
%typemap(jstype) time_t "java.util.Calendar"
%typemap(javain) time_t "$javainput"
%typemap(freearg) time_t ""
%typemap(in) time_t {
    if ($input) {
        jclass cls = JCALL1(GetObjectClass, jenv, $input);
        jmethodID f = JCALL3(GetMethodID, jenv, cls, "getTimeInMillis", "()J");
        $1 = JCALL2(CallLongMethod, jenv, $input, f)/1000;
    }
}
%typemap(out) time_t { 
    jclass cls = JCALL1(FindClass, jenv, "Ljava/util/Calendar;");

    jmethodID f = JCALL3(GetStaticMethodID, jenv, cls, "getInstance", "()Ljava/util/Calendar;");
    $result = JCALL2(CallStaticObjectMethod, jenv, cls, f);

    f = JCALL3(GetMethodID, jenv, cls, "setTimeInMillis", "(J)V");
    JCALL3(CallVoidMethod, jenv, $result, f, $1*1000L);
}

Это генерируется License.java

public class License {
  public void setCreationTime(java.util.Calendar value) {
    eveusb_javaJNI.License_creationTime_set(swigCPtr, this, value);
  }

  public java.util.Calendar getCreationTime() {
    return new SWIGTYPE_p_time_t(eveusb_javaJNI.License_creationTime_get(swigCPtr, this), true);
  }

getCreationTime ошибочно использует SWIGTYPE_p_time_t. Как исправить эту ошибку?

Теги:
swig

1 ответ

0

Я нашел решение. Причина в том, что time_t не был объявлен. Согласно документации swig, все неуказанные типы внутренне обрабатываются как указатели на структуры или классы. Эта декларация исправляет мою проблему

typedef long time_t;

И теперь создается правильный код:

  public java.util.Calendar getCreationTime() {
    return eveusb_javaJNI.License_creationTime_get(swigCPtr, this);
  }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню