0

JNI 调用存在一些问题。我有一个.cpp文件,其中包含佳能 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\include\win32" /EHsc -LD Check.cpp -FeCheck.dll

它抛出错误

Check.obj:错误 LNK2019:函数“int __cdecl check(void)”(?check@@YAHXZ) 中引用的未解析外部符号_imp _EdsInitializeSDK @0

同样,在调用任何相机函数时,都会引发类似的错误。问题是什么?作为一个独立的文件Check.cpp效果很好。

4

1 回答 1

0

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

关于您在这里所做的事情的旁注:您必须存储在hDLL某个地方以便以后可以访问它,以便能够在FreeLibrary不再需要该库后进行清理(例如)。小心LoadLibraryJNI 层中的资源分配(如 ),因为您必须释放分配的资源。否则,从长远来看,你会陷入热水中。

于 2013-02-24T11:55:20.350 回答