vc ++ JNI错误LNK2019:未解析的外部符号

时间:2013-12-03 15:41:27

标签: java c++ visual-c++ java-native-interface

美好的一天。 我正在尝试编译一个库,以便在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&gt; ftrJavaScanAPI.obj:错误LNK2019:函数中引用的未解析的外部符号ftrScanOpenDevice Java_com_Futronic_ScanApiHelper_Scanner_OpenDevice

据我所知,有必要添加代码从DLL导出一些符号以便导出库,但不知道该怎么做

1 个答案:

答案 0 :(得分:1)

您链接到DLL的是什么?您的源文件不包含函数'ftrScanOpenDevice',请确保将适当的.LIB文件添加到您的构建中。

在介绍DLL的复杂性之前。让你可以编译并运行这个简单的程序:

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

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

}

确保您可以编译并生成EXE文件。此外,您的可执行文件应该运行没有错误。它不应该产生任何输出。如果找不到有关未找到的DLL文件的错误,请确保您的路径或包含EXE文件的同一目录中有适当的DLL文件。此外,请确保您的最终JNI程序具有相同的DLL。

还有一件事,你不应该硬编码包含文件的绝对名称。使用Visual Studio设置将“FTRScanAPI”添加到包含和库路径。所以你的include指令应该只是

    #include "ftrScanAPI.h"