У меня есть эта структура
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. Как исправить эту ошибку?
Я нашел решение. Причина в том, что time_t не был объявлен. Согласно документации swig, все неуказанные типы внутренне обрабатываются как указатели на структуры или классы. Эта декларация исправляет мою проблему
typedef long time_t;
И теперь создается правильный код:
public java.util.Calendar getCreationTime() {
return eveusb_javaJNI.License_creationTime_get(swigCPtr, this);
}