0

サードパーティの 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;
4

1 に答える 1

0

次のような JNI チュートリアルに従ってみてください。

http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

まず、チュートリアルに従って、C++ メソッドを呼び出すことができる Java メソッドを取得します。次に、サード パーティの DLL を呼び出して、上記のコードと同様になるように C++ メソッドを変更します。

于 2013-07-26T13:19:10.503 に答える