簡體   English   中英

jni調用中未解決的外部符號錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM