Ошибка vc ++ JNI LNK2019: неразрешенный внешний символ

Добрый день. Я пытаюсь скомпилировать библиотеку для использования в Java. Но появляется ошибка «ошибка LNK2019: неразрешенный внешний символ». В c ++ мало разбираюсь, прошу помощи. Начать файл cpp

//ftrJavaScanAPI.cpp : Defines the entry point for the DLL application.
//
#ifdef _WINDOWS
#pragma warning (disable:4996)
#endif

#include "C:\ftrJavaScanAPI\ftrScanAPI.h"
#include "ftrJavaScanAPI.h"

#ifdef FTR_OS_UNIX
#include <string.h>
#endif

FTRHANDLE hDevice = NULL;
FTRSCAN_IMAGE_SIZE m_ImageSize;
FTR_DWORD m_dwErrCode = 0;

#ifdef _WINDOWS
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
#endif

JNIEXPORT jboolean JNICALL Java_com_Futronic_ScanApiHelper_Scanner_OpenDevice(JNIEnv *env, jobject obj)
{
    hDevice = ftrScanOpenDevice();
    if( hDevice == NULL )
        return JNI_FALSE;
    return JNI_TRUE;
}

Начните файл .h:

#include <C:\Program Files\Java\jdk1.7.0_05\include\jni.h>
/* Header for class com_Futronic_ScanApiHelper_Scanner */



#ifndef _Included_com_Futronic_ScanApiHelper_Scanner
#define _Included_com_Futronic_ScanApiHelper_Scanner
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_Futronic_ScanApiHelper_Scanner
 * Method:    OpenDevice
 * Signature: ()Z
 */

JNIEXPORT jboolean JNICALL Java_com_Futronic_ScanApiHelper_Scanner_OpenDevice
  (JNIEnv *, jobject);

Ошибка при отладке

1> ftrJavaScanAPI.obj: ошибка LNK2019: неразрешенный внешний символ ftrScanOpenDevice, указанный в функции Java_com_Futronic_ScanApiHelper_Scanner_OpenDevice

Я понимаю, что необходимо добавить код для экспорта некоторых символов из DLL, чтобы экспортировать библиотеку, но не знаю, как это сделать


person user1563372    schedule 03.12.2013    source источник
comment
Похоже, функция ftrScanOpenDevice не экспортируется должным образом - вы можете увидеть как это сделать здесь   -  person The Forest And The Trees    schedule 03.12.2013


Ответы (1)


Что вы подключаете к своей DLL. В ваших исходных файлах нет функции ftrScanOpenDevice. Убедитесь, что вы добавили в свою сборку соответствующий файл .LIB.

Прежде чем вы познакомитесь со сложностями DLL. Сделайте так, чтобы вы могли скомпилировать и запустить эту простую программу:

#include "C:\ftrJavaScanAPI\ftrScanAPI.h"

int main ()
{
   FTRHANDLE hDevice = ftrScanOpenDevice();

}

Убедитесь, что вы можете скомпилировать это и создать EXE-файл. Кроме того, ваш исполняемый файл должен работать без ошибок. Он не должен давать никаких результатов. Если возникают ошибки, связанные с отсутствием файлов DLL, убедитесь, что соответствующие файлы DLL доступны на вашем пути или в том же каталоге, что и ваш EXE-файл. Кроме того, убедитесь, что у вас есть те же библиотеки DLL, которые доступны для вашей окончательной программы JNI.

Еще одна вещь: вам не следует жестко кодировать абсолютные имена для ваших включаемых файлов. Используйте настройки Visual Studio, чтобы добавить «FTRScanAPI» в пути включения и библиотеки. Итак, ваша директива include должна быть просто

    #include "ftrScanAPI.h"
person Vlad    schedule 03.12.2013
comment
Эта маленькая программа генерирует ту же ошибку. ftrJavaScanAPI.obj: ошибка LNK2019: неразрешенный внешний символ ftrScanOpenDevice, указанный в функции main - person user1563372; 04.12.2013