Espen Harlinn Ответов: 3

Раздражающее предупреждение-предупреждение LNK4248: неразрешенный токен typeref


Я беру C++/CLI для спина, и я столкнулся с раздражающим предупреждением:
JNIEnvWrapper. obj: предупреждение LNK4248: неразрешенный токен typeref (0100000C) для '_jmethod'; изображение может не работать
JNIEnvWrapper.obj: предупреждение LNK4248: неразрешенный токен typeref (0100000D) для '_jfieldID'; изображение может не работать

#pragma managed(push,off)
struct JNIEnv_;
typedef JNIEnv_ JNIEnv;

struct JavaVM_;
typedef JavaVM_ JavaVM;

struct _jfieldID;
typedef _jfieldID *jfieldID;
struct _jmethodID;
typedef _jmethodID *jmethodID;

/* .. code removed ...*/

#pragma managed(pop)


Замена приведенного выше раздела на
#pragma managed(push,off)
#include <jni.h>
#pragma managed(pop)

это тоже не решает проблему ...

И я тоже
#pragma warning( disable : 4248 )


Как ни странно, я не получаю никаких предупреждений о JNIEnv_ или JavaVM_.
Я просто использую jmethodID и jfieldID в управляемом коде.

Декларация:
jmethodID FromReflectedMethod(JavaObject^ method);
jfieldID FromReflectedField(JavaObject^ field);


Реализации:
jmethodID JNIEnvWrapper::FromReflectedMethod(JavaObject^ method)
{
	jmethodID result = 0;
	jobject jObj = method->JNINative;
	result = env->FromReflectedMethod(jObj);
	return result;
}
jfieldID JNIEnvWrapper::FromReflectedField(JavaObject^ field)
{
	jfieldID result = 0;
	jobject jObj = field->JNINative;
	result = env->FromReflectedField(jObj);
	return result;
}


Таким образом, _jfieldID и _jmethod рассматриваются как непрозрачные типы. (Поскольку я не играю с внутренностями JDK, они вряд ли могут быть чем-то другим.) Код, кажется, работает просто отлично, но я хотел бы избавиться от предупреждений - они обычно существуют не просто так :).

Есть идеи? Я буду счастлив просто найти способ подавить предупреждение ...

С уважением
Эспен Харлинн

Sergey Alexandrovich Kryukov

Кстати, хороший вопрос.
--СА

Espen Harlinn

Спасибо - я буду очень рад, если это можно будет решить :)

3 Ответов

Рейтинг:
1

Alexander Gavriliuk

- Так как насчет фальшивой структуры?"

Сергей Александрович, это хорошо работает :-)

Спасибо! :-)


Рейтинг:
0

Sergey Alexandrovich Kryukov

Вы видели эту нить: http://social.msdn.microsoft.com/Forums/is/vclanguage/thread/0730e965-7299-44ca-8a95-59e2eb23d153[^]?

Я думаю, что здесь есть разумное объяснение. Ваш случай похож на случай неполной структуры в одном из примеров. Упоминается, что предупреждение исчезает, когда они удаляют
"/сброс". Я понимаю, что вам нужен флаг CLR, но вы наблюдаете то же самое? JNI неуправляема, поэтому предупреждение должно исчезнуть, если вы уберете флаг, просто для эксперимента.

—СА


Espen Harlinn

Да, я просто ищу способ избавиться от предупреждения на данный момент, так как я предполагаю, что получу довольно много даунвотов за публикацию кода, который не компилируется "чисто"; - >

Я не могу удалить опцию /clr, так как создаю библиотеку jni4net, которая интегрируется .Net и JNI ...

Sergey Alexandrovich Kryukov

Такое отрицательное голосование было бы глупо, так как вы четко заявляете, что невозможность компиляции без предупреждения...

Эспен, я же сказал, что в первую очередь вы не можете удалить "/clr". Я только спрашиваю вас, можете ли вы временно оставить только управляемый код и убедиться, что предупреждения зависят от "/clr". А вы могли бы?

--СА

Espen Harlinn

Большая часть кода взята из различных других работ, которые компилируются без сучка и задоринки; это связано с неполными типами и clr, так как я хотел бы избежать включения заголовка “jni.h” в публичный интерфейс библиотеки.

Sergey Alexandrovich Kryukov

Кстати, pragma suppress работает на вас? Видите ли, я подозреваю, что вы всегда можете получить предупреждение...
Однако есть и другая идея: не могли бы вы создать поддельную полностью определенную структуру для этой цели? Это будет правильно с точки зрения CLR, и структура не будет использоваться с JNI, потому что связанные функции из JNI будут нуждаться только в указателе? Вы понимаете эту идею?
--СА

Espen Harlinn

#pragma suppress, похоже, не существует, и это тоже не сработало:
#Pragma warning( disable : 4248 )

Sergey Alexandrovich Kryukov

Извините, я перепутал языки...
Итак, как насчет фальшивой структуры?
--СА

Рейтинг:
0

Member 2001915

редактировать средой JNI.H-файл Чанг фром "структура _jfieldID" до "структуры _jfieldID {}"


Dave Kreskowiak

Ты немного опоздала на вечеринку. Этот вопрос был задан шесть лет назад. Ваш ответ на самом деле ничего не добавляет к уже несуществующей дискуссии.