jni调用中未解决的外部符号错误

时间:2013-02-24 08:01:28

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

JNI调用存在一些问题。我有一个.cpp文件,其中包含canon sdk。 我的Java类Check.java有一个声明:

private native void check();

我的Check.cpp文件:

#include "stdafx.h"
#include "iostream"
#include "EDSDK.h"
#include "Check.h"

using namespace std;

int check();    
#define _CRT_SECURE_NO_WARNINGS
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);

JNIEXPORT void JNICALL Java_Check_check  (JNIEnv *, jobject){
  check();
}

int check(){

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
hDLL = LoadLibrary("EDSDK.dll");
EdsError e = EdsInitializeSDK();
}

基本上我的Check.cpp文件只是初始化相机。在致电:

  

cl -I" C:\ jdk1.7 \ include" -I" C:\ jdk1.7 \包括\ WIN32" / EHsc -LD Check.cpp -FeCheck.dll

它会抛出错误

  

Check.obj:错误LNK2019:未解析的外部符号_ imp _EdsInitializeSDK @ 0   函数" int __cdecl check(void)" (?检查@@ YAHXZ)

同样在调用任何相机功能时,会抛出类似的错误。有什么问题?作为独立文件Check.cpp效果很好。

1 个答案:

答案 0 :(得分:0)

此错误告诉您链接器无法解析EdsInitializeSDK。这与JNI无关。它只与您使用库的方式有关。如果您动态加载它,您还必须手动执行链接。这意味着您必须使用GetProcAddress在调用之前找到EdsInitializeSDK的入口点。

关于你在这里做什么的附注:你必须在某个地方存储hDLL以后你可以访问它以便能够在库之后进行清理(例如FreeLibrary)不再需要了。请注意JNI层中的资源分配(如LoadLibrary),因为您必须释放分配的资源。否则你会长期进入热水。