ошибка: тип массива 'va_list' (он же '__builtin_va_list') не может быть назначен - PullRequest
0 голосов
/ 30 января 2019

Что я должен сделать, чтобы сделать его назначаемым?Я автоматически сгенерировал функцию JNI из этой функции, которая была в заголовочном файле.Вот объявление функции в заголовочном файле *

char * stringFormatV (const char * format, va_list args);

    SWIGEXPORT jstring JNICALL Java_jnisourceJNI_stringFormatV(JNIEnv
        *jenv, jclass jcls, jstring jarg1, jlong jarg2) {
              jstring jresult = 0 ;
              char *arg1 = (char *) 0 ;
              va_list arg2 ;
              va_list *argp2 ;
              char *result = 0 ;

              (void)jenv;
              (void)jcls;
              arg1 = 0;
              if (jarg1) {
                arg1 = (char *)(*jenv)->GetStringUTFChars(jenv, jarg1, 0);
                if (!arg1) return 0;
              }
              argp2 = *(va_list **)&jarg2; 
              if (!argp2) {
                SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null va_list");
                return 0;
              }
              arg2 = *argp2; //here is the problem
              result = (char *)stringFormatV((char const *)arg1,arg2);
              if (result) jresult = (*jenv)->NewStringUTF(jenv, (const char *)result);
              if (arg1) (*jenv)->ReleaseStringUTFChars(jenv, jarg1, (const char *)arg1);
              return jresult;
            }

в этой строке компилятор выдает ошибку

arg2 = * argp2;// здесь проблема

1 Ответ

0 голосов
/ 30 января 2019

Возможно, вы захотите прочитать документацию аргумента переменной длины .Особенно раздел о обёртывании va_list, в котором говорится

Насколько нам известно, не существует очевидного способа обернуть эти функции SWIG.

Короче говоря, это не совсем возможно.

Единственное решение, которое я вижу, - предоставить функцию с переменным аргументом, для которой SWIG генерирует функцию, и эта функция vararg вызывает действительную функцию stringFormatV.

...