0

私はこのJavaテストを持っています

package ftct;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
import java.util.Date;

public class LibFTCT {


public LibFTCT() {
 }
 public interface LibFTCTLib extends StdCallLibrary {
          LibFTCTLib INSTANCE = (LibFTCTLib) Native.loadLibrary(
             "FTCTLib", LibFTCTLib.class);
      int a(int x);
      int DoCommand(int Command, int Param);
    int GetDataRecord(int RecordNum, int StreamNum, Date ReadingTime,
   double AIN1, double AIN2, double AIN3, double AIN4);

 }
}

Delphi DLL を呼び出します。パラメータを Delphi で var として配置すると、Java がクラッシュします。それ以外の場合、それらは読み取り専用です。

GetDataRecord が RecordNum などでデータを返すようにしたいのですが、Java でこれを行うにはどうすればよいですか?

4

1 に答える 1

3

パラメータは、参照によって渡されるという事実を伝える特別な型として宣言する必要があります。したがって、Delphi パラメータが次のような場合:

procedure Foo(var i: Integer; var d: Double);

これを次のように Java 関数にマップします。

void Foo(IntByReference i, DoubleByReference d);

そして、関数を呼び出すには:

IntByReference iref = new IntByReference();
DoubleByReference dref = new DoubleByReference();
INSTANCE.Foo(iref, dref);
int i = iref.getValue();
double d = dref.getValue():

これはすべて、ドキュメントで詳細に説明されています。

ByReference 引数の使用

関数が型へのポインター引数を受け入れる場合、ByReference 型のいずれかを使用して、戻り値をキャプチャするか、独自のサブクラスを作成できます。例えば:

// Original C declaration
void allocate_buffer(char **bufp, int* lenp);

// Equivalent JNA mapping
void allocate_buffer(PointerByReference bufp, IntByReference lenp);

// Usage
PointerByReference pref = new PointerByReference();
IntByReference iref = new IntByReference();
lib.allocate_buffer(pref, iref);
Pointer p = pref.getValue();
byte[] buffer = p.getByteArray(0, iref.getValue());

別の方法として、目的の型の単一要素を持つ Java 配列を使用することもできますが、ByReference 規則の方がコードの意図をより適切に伝えます。Pointer クラスは、getByteArray() に加えて、メモリーへの型キャストとして効果的に機能する多数のアクセサー メソッドを提供します。

タイプ セーフなポインターは、PointerType クラスから派生させることによって宣言できます。

于 2013-06-29T14:46:02.557 に答える