JNA と DLL は私にとってまったく新しい領域です...次の宣言を持つ関数を持つカスタム DLL があります。
int myfunc (const char*);
dll は、次のコマンドを使用して MinGW で正常にコンパイルされます。
>gcc -shared -omydll.dll mydll.c -lgdi32
ただし、DLL 内で関数が見つからないため、JNA でのロードは失敗します。
public interface mydll extends StdCallLibrary {
mydll INSTANCE = (mydll)Native.loadLibrary("mydll", mydll.class);
int myfunc (String arg);
}
私はいくつかの調査を行いましたが、この特定のエラーは DLL 関数の呼び出し手順と関係があるようです。__stdcall
と の__cdecl
手順を見てきました。また、多くの DLL 関数__declspec(dllexport)
が関数の宣言/実装の前に置かれていることもわかりました (これが何を意味するのか、何をするのかわかりません)。したがって、JNA の__stdcall
方がプロシージャーを好むように思われるため、関数は次のようになります。
__declspec(dllexport) int __stdcall myfunc (const char*);
これは非常に複雑に見えますが、私が試した他のどの方法よりも優れているわけではありません. HashMap を使用してアンダースコア プレフィックスと @4 サフィックスを追加しても機能しませんでした。
mydll INSTANCE = (mydll)Native.loadLibrary("mydll", mydll.class, new HashMap () {{
add("myfunc", "_myfunc@4");
}});
JNAのドキュメントはまったく役に立ちませんでした。正直なところ、私はもう何をしているのかわかりません。