0

C++で動作しているWindows上のハードウェアデバイスと通信するためのコードがいくつかあります。このコードは、デバイスのボタンのプッシュに反応するために非常に簡単なことを行います。これを、ボタンが押されたときに呼び出されるオブザーバーを使用してdllにコンパイルします。これを大きなJavaプログラムとインターフェースする必要があります。

JNAを使用するつもりでしたが、Cでのみ機能し、Cのオブザーバーパターンでこれを行う方法がわかりません。BridJとSWIG(どちらもC ++ DLLで動作するcliam)を使用して作成することを検討しました。コンパイルされたdll(関連付けられたヘッダーファイルを含む)へのインターフェイスですが、BridJは(JNAeratorStudioで)大量のファイルを作成し、エラーで停止し、SWIGを使用してWindowsで開始する方法がわかりません(私はむしろVisualStudioExpressを使用しています完全なVisualStudioよりも)。

C ++ DLLとJavaプログラムの統合に関するチュートリアルを知っている人はいますか?SWIGはかなり有望に見えますが、チュートリアルは「沼地」です。

以下のDLLと通信するための簡単なCコードをいくつか配置しました。

#include <iostream>
#include <stdio.h>

#include "DeepFocusControlDll.h"

using namespace std;
using namespace DeepFocusControl;

class MyObserver : public DeepFocusControl::DeepFocusObserver{
    void Event(){
        printf("***Button Pushed***");
    }
};

int main()
{
    DeepFocusControl::AVA6Control* dfc = new DeepFocusControl::AVA6Control();
    MyObserver* observer = new MyObserver();
    dfc->AddObserver(observer);
    bool connected = dfc->IsConnected();
    printf("Connected %s\n", (connected)?"true":"false");
    bool connectresult = dfc->Connect();
    printf("Connecting %s\n", (connectresult)?"true":"false");
    connected = dfc->IsConnected();
    printf("Connected %s\n", (connected)?"true":"false");
    dfc->SetHardwareAppLaunch(false);
    char waitChar;
    cin >> waitChar;
    dfc->SetHardwareAppLaunch(true);
    dfc->RemoveObserver(observer);
    dfc->Disconnect();
    printf("Disconnected\n");
    cin >> waitChar;
}

誰かがこれでオブザーバーパターンを使用するより簡単な方法を知っているなら、私はC側も喜んで再コーディングすることができます。

4

1 に答える 1

2

SWIGのディレクター機能を探しているようですね。最も単純な形式では、次のようなインターフェイスファイルを指定することで、SWIGでダイレクタを使用できます。

%module(directors=1) MyModule
%feature("director");         

%{
#include "mydll.h"
%}

%include "mydll.h"

ヘッダーファイル「mydll.h」が与えられた場合:

class Observer {
public:
  virtual void frobination() = 0;
  virtual ~Observer() {}
};

inline void bar(Observer *o) {
  o->frobination();
}

次に、SWIGを実行できます。

swig -Wall -java -c ++ mymodule.i

MyModuleこれにより、、、MyModuleJNIおよびの3つのJavaクラスが生成されますObserver。これらのうち、Javaにはフリー関数などがないため、メンバー関数MyModuleとして公開されているヘッダーファイルのすべてのフリー関数が含まれます。static無視しても問題ありません。実際のC++実装MyModuleJNIに接続するためにSWIGによって生成された接着剤です。ただし、正しく機能するように(したがって) MyModulemymodule_wrap.cxxをコンパイルし、それらから関数を呼び出す前にを使用してDLLをロードする必要があります。MyModuleJNIMyModuleSystem.loadLibrary

このObserverクラスは、のObserverインターフェイスに直接対応していますmydll.h。Javaでそれを派生させ、frobinate関数をオーバーライドして独自の実装を提供する必要があります。

public class Test extends Observer {
  @Override
  public void frobination() {
    System.out.println("go go gadget frobinator");
  }

  public static void main(String[] argv) {
    System.loadLibrary("mymodule");
    Test t = new Test();
    MyModule.bar(t);    
  }
}

これをコンパイルして実行し、あなたが望むことを正確に実行できます。

System.loadLibrary必要に応じて、次を追加してへの呼び出しを自動化できます。

%pragma(java) jniclasscode=%{
  static {
    try {
        System.loadLibrary("mymodule");
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load. \n" + e);
      System.exit(1);
    }
  }
%}

SWIGインターフェイスファイルに。

実際のヘッダーファイルが非常に単純である場合、同じ結果を得るのも非常に単純である必要があります。より複雑な場合は、さまざまな方法でラッピングの一部を特殊なケースにするようにSWIGに指示できます。

于 2012-06-22T15:11:01.440 に答える