【问题标题】:vc++ JNI error LNK2019: unresolved external symbolvc++ JNI 错误 LNK2019:无法解析的外部符号
【发布时间】:2013-12-03 23:57:56
【问题描述】:

美好的一天。 我正在尝试编译一个库以在 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:函数 Java_com_Futronic_ScanApiHelper_Scanner_OpenDevice 中引用的未解析的外部符号 ftrScanOpenDevice

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

【问题讨论】:

  • 函数 ftrScanOpenDevice 似乎没有正确导出 - 你可以看到 how to do so here

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


【解决方案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 "ftrScanAPI.h"

【讨论】:

  • 这个小程序产生了同样的错误。 ftrJavaScanAPI.obj:错误 LNK2019:函数 main 中引用的未解析的外部符号 ftrScanOpenDevice
猜你喜欢
  • 2020-07-09
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 2013-06-15
  • 2015-01-18
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多