サードパーティの dll のメソッドにアクセスする Java コードを書き込もうとしています。JNAを使用して直接マップしようとしましたが(構造体をパラメーターとして使用せずに関数を呼び出すことができます)、関数呼び出し後に構造体のフィールドにアクセスしようとすると問題が発生します(更新されませんでした)。したがって、私の勇敢な新しいアプローチは、独自の dll を作成してみることです。これは、Java コードからプリミティブ変数の型を取得し、それらを適切な構造に配置して、サード パーティの dll に渡します。
サードパーティの dll と正常にリンクしている C++ コードがありますが、Java コードをこの C++ コードで動作させるにはどうすればよいですか? C++ コードを dll にするのが最も簡単ですか? もしそうなら、どうすればよいですか? (したがって、このコードをdll自体に変換します。IDEとしてVisual Studio 2012とEclipse Junoを使用しています)
ここに C++ コード (.cpp)
#include <stdio.h>
#include <Windows.h>
#include "Header.h"
FINDNEODEVICES icsneoFindNeoDevices;
GETDLLVERSION icsneoGetDLLVersion;
//extern int __declspec(dllimport) add(int a, int b);
bool LoadLibDLL(HINSTANCE &hAPIDLL){
hAPIDLL = LoadLibrary(L"icsneo40.dll");
icsneoGetDLLVersion = (GETDLLVERSION) GetProcAddress(hAPIDLL, "icsneoGetDLLVersion");
icsneoFindNeoDevices = (FINDNEODEVICES) GetProcAddress(hAPIDLL, "icsneoFindNeoDevices");
return true;
}
int main() {
HINSTANCE icsneo40;
bool success = LoadLibDLL(icsneo40);
printf("Version #: %d\n", icsneoGetDLLVersion());
int aray [5] = {600, 600, 600, 100, 600};
int *p = aray;
int num = 10;
int lResult = icsneoFindNeoDevices(65545,p,&num);
printf("Serial NUmber: %d\n", aray[3]);
getchar();
return 0;
}
ヘッダー (.h)
typedef int (__stdcall *FINDNEODEVICES)(unsigned long DeviceTypes, int* myint, int *pNumDevices);
typedef int (__stdcall *GETDLLVERSION)(void);
extern FINDNEODEVICES icsneoFindNeoDevices;
extern GETDLLVERSION icsneoGetDLLVersion;