4

DLL ライブラリへのインターフェイスを作成しているので、Java で使用できます。jlong​​ パラメータの値を変更するには、ネイティブ関数が必要です。パラメータが参照によって渡されたように。私の Java メソッドには、ここに示されているネイティブ関数 MPUSBWrite と同じパラメーターが必要です。

実際に動作しないコードの例: MPUSBWrite は 4 番目のパラメーターを参照として取得し、その値を変更します。pLength 渡された変数を読み取ると、常に 0 になります。

ジャワ:

public static native boolean Write(long handle, byte[] pData, int dwLen, long pLength, int dwMilliseconds);

ネイティブ C++:

JNIEXPORT jboolean JNICALL Java_jPicUsb_iface_Write
(JNIEnv *env, jclass jc, jlong handle, jbyteArray pData, jint dwLen, jlong pLength, jint dwMilliseconds) {
    jniByteArray b(env, pData);
    DWORD res = MPUSBWrite((HANDLE)handle,b.getBytes(),dwLen,(PDWORD)pLength,dwMilliseconds);
    if (res) {
        return JNI_TRUE;
    } else {
        return JNI_FALSE;
    }
}

私の C++ コードが参照によって pLength 変数の値を変更する方法はありますか?

4

3 に答える 3

2

SWIGはこの機能をサポートしています。

SWIG を使用すると、C++ のポインターのように Java パラメーター値を更新できます。これは、オブジェクト パラメータに対して非常にうまく機能しています。Long オブジェクトを入れて動作させることができます。

Swig を使用すると、関数呼び出しの後にポインター値を Java オブジェクトに入れることができる Java と C++ の間にレイヤーを作成できます。Swig は Java クラスも生成します。C++ 関数を呼び出す必要があります。C++ 関数がパラメーターとして別の C++ クラスを含む場合、Swig はこの C++ クラスを、getter、setter、および呼び出したいすべての C++ 関数を含む Java オブジェクトとして生成します。

この機能のために、Swig には、VisualStudio プロジェクトで作成する必要がある特別な言語があります。しかし、これはすべてSwigマニュアルに記載されています

SWIG は、C および C++ で記述されたプログラムをさまざまな高級プログラミング言語に接続するソフトウェア開発ツールです。SWIG は、Perl、PHP、Python、Tcl、Ruby などの一般的なスクリプト言語を含むさまざまな種類の言語で使用されます。サポートされている言語のリストには、C#、Common Lisp (CLISP、Allegro CL、CFFI、UFFI)、Java、Lua、Modula-3、OCAML、Octave、R などの非スクリプト言語も含まれています。

于 2009-04-24T08:39:40.720 に答える
1

いいえ。

本当にこれを行う必要がある場合の最良のオプションは、4 番目のパラメーターを long[] として定義し、JNI コードで配列要素を更新することです。

実際、最善の選択肢は、メソッドから long を返せない理由を検討することです。

于 2009-01-28T23:20:46.127 に答える
0

これは JNI の問題ではありません。関数は値によって呼び出され、それを変更する方法はありません。オブジェクトまたは配列を渡して、参照を取得できるようにします。

于 2009-04-24T08:30:54.763 に答える