Отображение неопределенной ссылки на определенный объект - PullRequest
1 голос
/ 12 мая 2011

Я пытаюсь хэшировать несколько строк в моем проекте. И я использую следующий проект, который использует алгоритм HAMC SHA1 http://www.codeproject.com/KB/recipes/HMACSHA1class.aspx

Я смог скомпилировать весь код после многих неприятностей. Но в конце я остаюсь с последней проблемой, связанной с неопределенными ссылками.

Я написал следующий код для вызова классов HMAC SHA1, приведенных в проекте, который выглядит следующим образом

BYTE Key[20] ;
BYTE digest[20] ; 

unsigned char *test = (unsigned char *)"Hi There" ; 

extern "C" {
 jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz );
}


jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{

memset(Key, 0x0b, 20) ;

CHMAC_SHA1 HMAC_SHA1 ;

HMAC_SHA1.HMAC_SHA1(test, strlen((const char *)test), Key, sizeof(Key), digest) ;

    return env->NewStringUTF("Hello from JNI Sample!");

}

Произошла ошибка в следующих строках HMAC_SHA1.cpp:

CSHA1::Update((UNIT_8 *)key, key_len);

CSHA1::Update((UNIT_8 *)AppendBuf1, sizeof(m_ipad) + text_len);

CSHA1::Update((UNIT_8 *)AppendBuf2, sizeof(m_opad) + SHA1_DIGEST_LENGTH);

Здесь я получаю сообщение об ошибке:

Error: undefined reference to 'CSHA1::Update(unsigned char*, unsigned long)'

Сейчас в SHA1.h

я вижу следующий код

/////////////////////////////////////////////// ////////////////////////////// // Определяем 8- и 32-битные переменные

#ifndef UINT_32

#ifdef _MSC_VER

#define UINT_8  unsigned __int8
#define UINT_32 unsigned __int32

#else

#define UINT_8 unsigned char

#if (ULONG_MAX == 0xFFFFFFFF)
#define UINT_32 unsigned long
#else
#define UINT_32 unsigned int
#endif

#endif
#endif

//////////////////////////////////// и объявление функции выглядит следующим образом:

// Update the hash value
void Update(UINT_8 *data, UINT_32 len);

Я использую среду Windows, но компилирую в cygwin.

Я не уверен, почему я получаю такую ​​ошибку

Ошибка: неопределенная ссылка на 'CSHA1 :: Update (unsigned char *, unsigned long)'

Кто-нибудь может указать, в чем проблема и как ее можно исправить?

Я считаю, что что-то не так с _MSC_VER, потому что оно должно быть ложным, а затем UINT_8 должен быть определен беззнаковым символом. Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

SHA1.h не включает ограничения, следовательно, ULONG_MAX не определено.Это приводит к проблемам в 32-битных системах.

Скажите #include <climits> где-нибудь в верхней части файла, и все должно быть сделано.

1 голос
/ 12 мая 2011

Одна вещь, которую вы можете сделать, это использовать типы, определенные в SHA1.h, в своем собственном коде при объявлении test, чтобы убедиться, что вы вызываете функцию с правильными типами аргументов.

...