0

私はJNAに少し問題があります。

私のコード:

ヘッダー c:

#ifndef IOPROTOCOL_H_INCLUDED
#define IOPROTOCOL_H_INCLUDED

typedef signed char INT8;
typedef short       INT16;
typedef int         INT32;
typedef unsigned char  UINT8;
typedef unsigned short UINT16;
typedef unsigned int   UINT32;

/* Types d'IO */
typedef enum { IOT_U1, IOT_U2, IOT_U8, IOT_I8, IOT_U16, IOT_I16, IOT_U32, IOT_I32, IOT_F32, IOT_STRING, IOT_MAX } IoTypeE;

typedef union {
    INT32  i;
    UINT32 u;
    float  f;
    char * s;
} Value;

typedef struct {
    int (*Read) (char *rxbuf, int rxlen, UINT8 interTo);
    int (*Write) (char *txbuf,int txlen);
    int (*FunctionResponse) (int address, Value value, IoTypeE type);
    int (*SendTraceRoute) (char * trace);
} DeviceFuncT;


    int readTrame( DeviceFuncT *deviceFunct, UINT32 function, UINT32 address, UINT32 countAddress, UINT32 slave, UINT32 type);
    int writeTrame(DeviceFuncT *deviceFunct, UINT32 function, UINT32 address, Value value, UINT32 type, UINT32 slave);


#endif // IOPROTOCOL_H_INCLUDED

DeviceFuncT は Java で作成され、関数 readTrame または writeTrame のパラメーターで渡されます。

私は C で呼び出します(dll ^^) DeviceFuncT->(*Read) (char *rxbuf, int rxlen, UINT8 interTo);

ジャバでは、

 public static interface ReadFunct extends com.sun.jna.Callback{
        int invoke(String rxbuf, int rxlen, byte interto);
    }

だからchar* rxbuf == String rxbuf

関数を終了する前に Java で rxbuf を処理する必要があり、その後 rxbux en C を処理しますが、C の関数で Java に値が設定されていません...

この問題を解決できますか? お願いします :)。

私の説明で申し訳ありません。

ありがとうございました。

4

2 に答える 2

0

Stringネイティブ タイプがconst char *(読み取り専用の C 文字列) の場合にのみ使用してください。ネイティブ型が実際にネイティブ側が書き込むバッファである場合、Java からネイティブ コードを呼び出すとき、およびコールバックでネイティブ コードからデータを受信するときに、プリミティブ配列com.sun.jna.Memory、または NIO ダイレクト バッファを使用する必要があります。Pointer

コールバックで this を使用しているため、パラメーターは type である必要がありますPointer。その後、さまざまなPointerアクセス方法を使用して、メモリから読み取りまたは書き込みを行うことができます。

java.nio.Bufferネイティブ コードはこれらのオブジェクトを作成できないため、プリミティブ配列やコールバックで使用することStringはできず、 Java の内容を変更できないため不適切ですString

于 2012-05-04T16:31:45.337 に答える
0

Java でパラメータを変更する必要はありません。これは文字列を渡します。ポインターなしで文字列を受け取るには、c のコードを変更する必要があります。

Int invoke (String rxbuf, int rxlen, int byte) {
Char Newrxbuf [200];
    Strcpy (Newrxbuf, rxbuf.t_str ());
}

.t_str()ビルダー c ++ 2010 に適用されますが、文字列をchar *c の他のバージョンに変換できます

于 2017-08-05T04:33:24.720 に答える