web-dev-qa-db-ja.com

Javaコードから外部dll関数を呼び出す方法

DLLコードから外部Javaライブラリ関数を呼び出す必要があります。Netbeans7.2を使用しています。dllの関数は次のとおりです。

Boolean  isValid(string  Word)
List<String> getWords(String  Word)

私は this の例に従っています。しかし、dll関数を宣言する方法がわかりません。そして、私は別の リンク を見つけました。しかし、それは私にはうまくいきません。

7
Temp Temp

「JavaからDLLを呼び出す」」という同じ問題に遭遇し、最初は複雑さに不満を感じましたが、エレガントな解決策があります(処理中の人々にとっても興味深いかもしれません) .org habitat ..)質問のかなり「一般的な」形式を考えると(おそらく、ダウンレーティングはそのために正当化されない)、かなり簡単な解決策が示されると思います。言い換えれば、混乱を回避する解決策です。ソースコードが必ずしも利用可能であるとは限らないのと同様に、ヘッダーファイル、追加の変換などを使用します。

そのための私の推奨事項はJNA( https://github.com/twall/jna )であり、これは基本的にJNIの単純化されたラッパーです。これはうまく機能し、型マッピングは簡単です(たとえば、pchar = lpcstr buffer-> string)が、WindowsDLLとDelphi-Pascalを使用して作成された独自のCスタイルDLLに対してのみ使用しています。考慮すべき唯一のことは、戻り値は、フラグが立てられた参照変数を「出力」するのではなく、関数を介してエクスポートする必要があるということです。この質問は、その例を提供するリンクされたソースをすでに示しています(したがって、JNIに関する回答はここで見当違いになる可能性があります)。私が提供したリンクには、配列とポインターを転送するための例も含まれていることに注意してください。

7
monnoo

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
}
2
Javier

私は少し前にサンプルチュートリアルを書きました、多分それは助けになるでしょう。

http://wendro.blogspot.com/2010/03/jni-example-Eclipse-dev-cpp.html

1
wendro

ネイティブ関数を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)でリストをインスタンス化する方が簡単だと思います。 この例 を参照してください。

1
Javier