2012-05-04 12 views
0

私はJNA経由でjavaからアクセスできるDLLを生成しようとしています。UnsatisfiedLinkError - C++ DLLを作成するには?

私はシンプルなものを試してみてください。

CPP:

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

のiostreamも含まれており、コンパイルした後、私は得る:CreateDll.dll

を私は今、生成することができますVisual Studioのビア* .dll。別のインタフェースもあり

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"); 
    } 
} 

::私は次のようにJavaのにロードしてみてください

輸入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:私は多くのトピックがあることを知っていますが、すでに解決しようとしていません。私を助けてください。

+0

私はあなたのDLLが必要なシンボルをエクスポートされていない推測しています。 – Nick

+0

エクスポートされた関数名を表示するには、dependency walker(http://www.dependencywalker.com/)を使用します。 – technomage

+0

とにかくコンパイルするつもりなら、[JavaCPP](http://code.google.com/p/javacpp/)はおそらくJNAよりも使いやすくなります。 –

答えて

0

(C++を使用している場合)あなたは、輸出との両方に必要な関数名を非飾ります。

Windowsでは、機能は通常、エクスポートのために__declspec(dllexport)で利用可能になります。

どのプラットフォームでも、機能が非管理形式でエクスポートされるようにするには、extern "C"を使用する必要があります。具体的に

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

あり、エクスポート機能を指定する他の方法がありますが、これはおそらく最も一般的で使うのが簡単です。 を使用しない場合は、[email protected]@のようになります。コンパイラとリンカーは、追加のガベージ文字を使用して、その呼び出しシグネチャに基づいて特定の関数を一意に識別できるようにします。

+0

これは質問を解決しました。 ありがとうございました! –

0

あなたがシンボルをエクスポートする:

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

実装するクラスがある場合はどうなりますか? "C" ボイド__declspec(DLLEXPORTを)をexternべきでは使用でき

namespace simpleDLLNS 
{ 
    class simpleDLL 
    { 
    public: 

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

:.hファイルには、次のようになりますどこ? 関数を実装するときに使用しました。私は、DLLを開いたときには、それはこのように見えた:?

simpleCall @ simpleDLL @ simpleDLLNS @@ QAEXXZ

関連する問題