7

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

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

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

4

4 に答える 4

8

「Java から DLL を呼び出す」という同じ問題に出くわし、最初はその複雑さに不満を感じました。それでも、洗練された解決策があります (procing.org の生息地にいる人々にとっても興味深いかもしれません..) 質問のかなり「一般的な」形式を考えると (おそらく、そのために格下げは正当化されません)、私は、かなり簡単な解決策が示されます。言い換えれば、ソースコードが必ずしも利用可能であるとは限らないのと同じように、ヘッダーファイルや余分な変換などをいじるのを避けるソリューションです。

そのための私の推奨は JNA ( https://github.com/twall/jna ) です。これは基本的に JNI の単純化されたラッパーです。それはうまく機能し、タイプ マッピングは簡単です (例: pchar = lpcstr バッファ -> 文字列)。考慮すべき唯一のことは、フラグ付きの参照変数を「アウト」するのではなく、関数を介して戻り値をエクスポートする必要があるということです。質問は、その例を提供するリンクされたソースをすでに指しています (そのため、JNI に関する回答はここで間違っている可能性があります)。私が提供したリンクには、配列とポインターを転送するための axamples も含まれていることに注意してください。

于 2013-09-30T19:51:32.537 に答える
2

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
}
于 2013-02-21T08:38:46.777 に答える
1

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

于 2013-02-21T08:56:07.303 に答える
1

少し前にサンプルチュートリアルを書きましたが、役立つかもしれません。

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

于 2013-02-21T08:21:47.053 に答える