0

JNAを介してJavaからアクセスできるdllを生成しようとしています。

簡単なものを試してみます:

CPP:

void Initialize()
{
  std::cout<< "Hello World!";
}

iostreamも含まれており、コンパイルすると次のようになります:CreateDll.dll

Visual Studioを介して、*。dllを生成できるようになりました。

これを次のようにJavaにロードしてみます。

public class mainRoutine {
  public static void main(String[] args) {
    NativeWrapper INSTANCE = (NativeWrapper) Native.loadLibrary("CreateDll" , NativeWrapper.class);             
    INSTANCE.Initialize();
  }

  static {
    System.setProperty("jna.library.path", "C:\\workspace\\JNA");
  }
}

別のインターフェースもあります:

インポートcom.sun.jna.Library;

public interface NativeWrapper extends Library {
  void Initialize();
}

したがって、Java関数を実行すると、エラーが発生します。

 java.lang.UnsatisfiedLinkError: 
  Error looking up function 'Initialize': 
   The specified procedure could not be found.

私は何が欠けていますか?

PS:たくさんのトピックがあることは知っていますが、もう1日試してみても、解決策が見つかりませんでした。私を助けてください。

4

3 に答える 3

0

シンボルをエクスポートしていますか:

void _declspec(dllexport) Initialize()
{
  std::cout<< "Hello World!";
}
于 2012-05-04T16:14:40.330 に答える
0

関数名をエクスポートするか、(C ++を使用している場合は)装飾を解除する必要があります。

Windowsでは、関数は通常、を使用してエクスポートできるようになります__declspec(dllexport)

どのプラットフォームでも、関数が管理されていない形式でエクスポートされるようにするには、を使用する必要がありますextern "C"

具体的には:

extern "C" void __declspec(dllexport) Initialize() { ... }

エクスポートされた関数を指定する方法は他にもありますが、これはおそらく最も一般的で簡単に使用できます。を使用しない場合extern "C"、関数はのようになりますInitializeZ@ASDF@。ここでは、追加のガベージ文字がコンパイラとリンカによって使用され、呼び出し元の署名に基づいて特定の関数を一意に認識できるようにします。

于 2012-05-04T16:24:53.673 に答える
0

実装するクラスがある場合はどうなりますか?ここで、.hファイルは次のようになります。

namespace simpleDLLNS
{
    class simpleDLL
    {
    public:

       char giveVoidPtrGetChar(void* param);
       int giveIntGetInt(int a);
       void simpleCall(void);
       int giveVoidPtrGetInt(void* param);
    };
}

extern "C" void __declspec(dllexport)はどこで使用する必要がありますか?関数を実装するときに使用しました。しかし、dllを開くと、次のようになりました。

?simpleCall @ simpleDLL @ simpleDLLNS @@ QAEXXZ

于 2012-07-06T14:43:03.340 に答える