2016-04-25 31 views
0

私の現在のプロジェクト私のJavaアプリケーション内からいくつかのC++コードを使用する必要があります。共通の解決策は、C++の部分からDLLを作成し、JNA経由でアクセスすることです。私はC++になると全体の初心者なので、最小限の基礎から始め、そこから作業を続けます。しかし、私はこれらの最小限の例を実行することさえできません。ここに私がやったことだ:JNAとC++ - UnsatisfiedLinkErrorの結果となる最小限の例

私は私のDLLを作成するためのVisual Studioのドキュメントを使用し(ここで見つける:https://msdn.microsoft.com/de-de/library/ms235636.aspx

何をすることで、ヘッダ

// MathFuncsDll.h 

#ifdef MATHFUNCSDLL_EXPORTS 
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else 
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif 
namespace MathFuncs 
{ 
// This class is exported from the MathFuncsDll.dll 
class MyMathFuncs 
{ 
public: 
    // Returns a + b 
    static MATHFUNCSDLL_API double Add(double a, double b); 
}; 
} 

と.cppファイルを定義することがありますファイル

// MathFuncsDll.cpp : Defines the exported functions for the DLL application. 

#include "stdafx.h" 
#include "MathFuncsDll.h" 
#include <stdexcept> 

using namespace std; 

namespace MathFuncs 
{ 
double MyMathFuncs::Add(double a, double b) 
{ 
    return a + b; 
} 
} 

そしてそれをDLLにビルドします。これまでのところ、これは間違いなく働いた。 私は再びJNAドキュメントにこだわり、JNAを通じてこのDLLにアクセスするために小さなJavaのprogrammを書くことを進ん:ます。java.lang.UnsatisfiedLinkErrorスレッドで 例外「メイン」:

import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.Platform; 

/** Simple example of JNA interface mapping and usage. */ 
public class HelloWorld { 

    // This is the standard, stable way of mapping, which supports extensive 
    // customization and mapping of Java to native types. 

    public interface CLibrary extends Library { 
     CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "zChaffDLL" : "c"), CLibrary.class); 

     double Add(double a, double b); 
    } 

    public static void main(String[] args) { 
     CLibrary.INSTANCE.Add(5d, 3d); 

    } 
} 

がこのエラーになり実行:関数 'Add'を検索中にエラーが発生しました:指定されたプロシージャが見つかりませんでした。

私はちょっと動きましたが、問題を解決できませんでした。この時点では、もっと簡単な例を作ることができないので、かなり失われています。だから、助けや指針は本当に感謝しています。

+0

C++とCは異なるインタフェース(ABI)を持っています.C++ライブラリに '' 'CLibrary'''型をロードしているという事実は、すでに私には疑わしいようです。また、参照:[JavaネイティブアクセスはC++を行いません。](http://stackoverflow.com/questions/2241685/java-native-access-doesnt-do-c-right)代わりにJNIを使​​うほうがいいかもしれませんが、もう少し作業があります。 –

答えて

0

C++ "mangles"は、コンパイラの気まぐれに応じて名前をエクスポートしました。例えば、 "void main(argc、argv)"は "_Vmain_IPP @ xyzzy"と出てくるかもしれません。

DLLにdepends.exeを実行すると、エクスポートされた名前の外観を確認できます。コード内のextern "C"は、C++がエクスポートされた関数名のマングリングを防止します。

JNAは静的関数をうまく処理します。 JNAeratorは自動的に余分なマングリングを処理しますが、C++クラスをJavaクラスにマップする場合は、SWIGなどの方がよいでしょう。

+0

私はextern "C"を使用しようとしましたが、助けにはなりませんでした。 depends.exeは正しい関数名を表示しますが、?彼らの前では。これまでのところ、なぜそれが – dhyr

+0

であるのかわかりませんでした。更新されたソースとdepends.exeの出力をあなたの質問に表示してください。 – technomage

関連する問題