Java コードから外部 DLL ライブラリ関数を呼び出す必要があります。Netbeans 7.2 を使用しています。私のdllの機能は次のとおりです。
Boolean isValid(string word)
List<String> getWords(String word)
私はこの例に従っています。しかし、dll 関数を宣言する方法がわかりません。そして、別のリンクを見つけました。しかし、それは私にはうまくいきません。
「Java から DLL を呼び出す」という同じ問題に出くわし、最初はその複雑さに不満を感じました。それでも、洗練された解決策があります (procing.org の生息地にいる人々にとっても興味深いかもしれません..) 質問のかなり「一般的な」形式を考えると (おそらく、そのために格下げは正当化されません)、私は、かなり簡単な解決策が示されます。言い換えれば、ソースコードが必ずしも利用可能であるとは限らないのと同じように、ヘッダーファイルや余分な変換などをいじるのを避けるソリューションです。
そのための私の推奨は JNA ( https://github.com/twall/jna ) です。これは基本的に JNI の単純化されたラッパーです。それはうまく機能し、タイプ マッピングは簡単です (例: pchar = lpcstr バッファ -> 文字列)。考慮すべき唯一のことは、フラグ付きの参照変数を「アウト」するのではなく、関数を介して戻り値をエクスポートする必要があるということです。質問は、その例を提供するリンクされたソースをすでに指しています (そのため、JNI に関する回答はここで間違っている可能性があります)。私が提供したリンクには、配列とポインターを転送するための axamples も含まれていることに注意してください。
Java Native Interface (JNI)を使用する必要があります。これは、ネイティブ コードが Java コードとやり取りできるようにする C/C++ 関数のセットです (つまり、Java 関数呼び出しからパラメーターを受け取り、結果を返すなど)。JNI 呼び出しを受け取り、外部ライブラリを呼び出すラッパー C ライブラリを作成します。
たとえば、次の関数はupdateHandlers
ネイティブ オブジェクト (Java 側に長く格納されている) のメソッドを呼び出します。
class MyImpl {
void updateHandlers(JNIEnv *env) {
this->contentHandler = ....;
}
}
JNIEXPORT void JNICALL Java_package_Classname_updateHandlers0
(JNIEnv *env, jobject obj, jlong ptr)
{
((MyImpl*)ptr)->updateHandlers(env);
}
package.ClassName の対応する宣言は次のとおりです。
private long ptr; //assigned from JNI
public void updateHandlers() {
if (ptr==0) throw new NullPointerException();
updateHandlers0(ptr);
}
private native void updateHandlers0(long ptr);
static {
try {
/*try preloading the library external.dll*/
System.loadLibrary("external");
} catch (UnsatisfiedLinkError e) {
/*library will be resolved when loading myjni*/
}
System.loadLibrary("myjni"); //load myjni.dll
}
native private ...
必要な署名を使用して、Java ( ) でネイティブ関数を宣言します。次に、javah
(JDK で提供されるツール) を実行して、ネイティブ ヘッダーを生成します。A List<String>
(実際にList
は型消去のため a ) は、jobject
ネイティブ コードでは a です。
対応する C メソッドは次のようになります。
JNIEXPORT jobject JNICALL package_Classname_getWords(JNIEnv *env, jobject jobj, jstring word)
jobjectArray
文字列の配列を返し、返された値からJavaでリストをインスタンス化する方が簡単だと思います。この例を参照してください。
少し前にサンプルチュートリアルを書きましたが、役立つかもしれません。
http://wendro.blogspot.com/2010/03/jni-example-eclipse-dev-cpp.html