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
效果很好。
答案 0 :(得分:0)
此错误告诉您链接器无法解析EdsInitializeSDK。这与JNI无关。它只与您使用库的方式有关。如果您动态加载它,您还必须手动执行链接。这意味着您必须使用GetProcAddress在调用之前找到EdsInitializeSDK的入口点。
关于你在这里做什么的附注:你必须在某个地方存储hDLL
以后你可以访问它以便能够在库之后进行清理(例如FreeLibrary
)不再需要了。请注意JNI层中的资源分配(如LoadLibrary
),因为您必须释放分配的资源。否则你会长期进入热水。