Ошибка перегруженной функции C ++ - PullRequest
0 голосов
/ 02 августа 2010

Я работаю с JNI над текущим проектом и получаю странную ошибку из моего кода C ++ во время компиляции.Я получаю сообщение об ошибке:

ошибка: перегруженная функция без контекстной информации о типе

Это происходит из строки "nativegetsupportedciphersuites" в следующем массиве, который отображает функции Java с их аналогами в C ++.Я вырезал другие элементы массива, чтобы их было легче читать.

static JNINativeMethod sSocketImplMethods[] =
{
...
    {"nativegetsupportedciphersuites", "()[Ljava/lang/String;", (void*)&Java_mypackage_SocketImpl_nativegetsupportedciphersuites},
...
};

Я думаю, что это должно быть ошибка с объявлением типа, но на самом деле понятия не имею.Объявление типа было сгенерировано функцией javah, поэтому я предполагаю, что это правильно.Сигнатура функции вышеуказанного метода показана ниже:

JNIEXPORT jobjectArray JNICALL Java_mypackage_nativegetsupportedciphersuites(JNIEnv* env, jobject object)

Есть мысли?

Крис

Ответы [ 2 ]

1 голос
/ 02 августа 2010

Сообщение об ошибке указывает, что ваш метод перегружен.Компилятор не может определить, на какую из перегрузок вы хотите взять указатель, поскольку он не имеет никакой информации о параметрах.

Похоже, вы не намеревались перегружать метод.У вас есть второе объявление этого метода где-нибудь?Используете ли вы одинаковую подпись как в заголовке, так и в теле?

0 голосов
/ 02 августа 2010

Как правило, вы не должны приводить указатели функций к void * - некоторые платформы не могут разместить указатель на функцию в void *.Тип указателя универсальной функции - void (*) (), хотя, очевидно, вы должны привести к правильному типу перед вызовом функции, чтобы избежать повреждения стека.

Ошибка предполагает, чтомогут быть две разные перегрузки для видимых Java_mypackage_nativegetsupportedciphersuites (возможно, потому что подпись в вашем файле .cpp не совсем совпадает с подписью в сгенерированном javah файле .h), и, следовательно, она не может выбрать ту, которую вы хотите, основываясь на типе, который выпреобразуете в (что является просто пустым *).

Правильно ли вы установили 'extern "C" в исходном файле?

...