私の現在のプロジェクト私の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'を検索中にエラーが発生しました:指定されたプロシージャが見つかりませんでした。
私はちょっと動きましたが、問題を解決できませんでした。この時点では、もっと簡単な例を作ることができないので、かなり失われています。だから、助けや指針は本当に感謝しています。
C++とCは異なるインタフェース(ABI)を持っています.C++ライブラリに '' 'CLibrary'''型をロードしているという事実は、すでに私には疑わしいようです。また、参照:[JavaネイティブアクセスはC++を行いません。](http://stackoverflow.com/questions/2241685/java-native-access-doesnt-do-c-right)代わりにJNIを使うほうがいいかもしれませんが、もう少し作業があります。 –