[英]Unresolved external symbol error in jni call
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)”中引用的未解析的外部符號_ imp _EdsInitializeSDK @ 0(?check @@ YAHXZ)
類似地,在調用任何照相機功能時,都會引發類似的錯誤。 有什么問題 作為一個獨立文件, Check.cpp
可以正常運行。
該錯誤告訴您鏈接器無法解析EdsInitializeSDK。 這與JNI不相關。 它僅與您使用圖書館的方式有關。 如果動態加載它,則還必須手動執行鏈接。 這意味着您必須在調用它之前使用GetProcAddress查找EdsInitializeSDK的入口點。
關於您在此處執行的操作的hDLL
:您必須將hDLL
存儲hDLL
某個位置,以便以后可以訪問它,以便在不再需要該庫之后能夠進行清理(例如FreeLibrary
)。 請注意在JNI層中進行資源分配(例如LoadLibrary
),因為您必須釋放分配的資源。 否則,從長遠來看,您會陷入困境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.