0

JNI 呼び出しに問題があります。.cppcanon 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: 未解決の外部シンボル _ imp _EdsInitializeSDK@0 が関数 "int __cdecl check(void)" で参照されました (?check@@YAHXZ)

同様に、カメラ関数のいずれかを呼び出すと、同様のエラーがスローされます。どうした?スタンドアロンファイルとしてCheck.cppうまく機能します。

4

1 に答える 1

0

このエラーは、リンカーが EdsInitializeSDK を解決できないことを示しています。これは JNI とは関係ありません。ライブラリの使用方法にのみ関連しています。動的にロードする場合は、リンクも手動で実行する必要があります。これは、呼び出す前にGetProcAddressを使用して EdsInitializeSDK のエントリ ポイントを見つける必要があることを意味します。

ここで行っていることについての補足:ライブラリが不要になった後にhDLLクリーンアップ (たとえば) を実行できるように、後でアクセスできる場所に保存する必要があります。割り当てられたリソースを解放する必要があるため、JNI レイヤーFreeLibraryでのリソース割り当て ( など) には注意してください。LoadLibraryそうしないと、長期的にはお湯に浸かってしまいます。

于 2013-02-24T11:55:20.350 に答える