DLLコードから外部Javaライブラリ関数を呼び出す必要があります。Netbeans7.2を使用しています。dllの関数は次のとおりです。
Boolean isValid(string Word)
List<String> getWords(String Word)
私は this の例に従っています。しかし、dll関数を宣言する方法がわかりません。そして、私は別の リンク を見つけました。しかし、それは私にはうまくいきません。
「JavaからDLLを呼び出す」」という同じ問題に遭遇し、最初は複雑さに不満を感じましたが、エレガントな解決策があります(処理中の人々にとっても興味深いかもしれません) .org habitat ..)質問のかなり「一般的な」形式を考えると(おそらく、ダウンレーティングはそのために正当化されない)、かなり簡単な解決策が示されると思います。言い換えれば、混乱を回避する解決策です。ソースコードが必ずしも利用可能であるとは限らないのと同様に、ヘッダーファイル、追加の変換などを使用します。
そのための私の推奨事項はJNA( https://github.com/twall/jna )であり、これは基本的にJNIの単純化されたラッパーです。これはうまく機能し、型マッピングは簡単です(たとえば、pchar = lpcstr buffer-> string)が、WindowsDLLとDelphi-Pascalを使用して作成された独自のCスタイルDLLに対してのみ使用しています。考慮すべき唯一のことは、戻り値は、フラグが立てられた参照変数を「出力」するのではなく、関数を介してエクスポートする必要があるということです。この質問は、その例を提供するリンクされたソースをすでに示しています(したがって、JNIに関する回答はここで見当違いになる可能性があります)。私が提供したリンクには、配列とポインターを転送するための例も含まれていることに注意してください。
Java Native Interface(JNI) を使用する必要があります。これは、ネイティブコードがJavaコードとインターフェイスできるようにする(つまり、受信する)C/C++関数のセットです。 Java関数呼び出し、結果の戻りなど)からのパラメーター。JNI呼び出しを受信するラッパーCライブラリーを作成してから、外部ライブラリーを呼び出します。
たとえば、次の関数は、ネイティブオブジェクト(Java側)に保存されている限り)でメソッドupdateHandlers
を呼び出します。
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
}
私は少し前にサンプルチュートリアルを書きました、多分それは助けになるでしょう。
http://wendro.blogspot.com/2010/03/jni-example-Eclipse-dev-cpp.html
ネイティブ関数をJava(native private ...
)必要な署名付き。次に、javah
(JDKで提供されるツール)を実行して、ネイティブヘッダーを生成します。 A List<String>
(型消去のため、実際にはList
)は、ネイティブコードではjobject
です。
対応するCメソッドは次のようになります。
JNIEXPORT jobject JNICALL package_Classname_getWords(JNIEnv *env, jobject jobj, jstring Word)
文字列jobjectArray
の配列を返し、戻り値からJava)でリストをインスタンス化する方が簡単だと思います。 この例 を参照してください。