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(since dll ^^) DeviceFuncT->(*Read) (char *rxbuf, int rxlen, UINT8 interTo);

在java中,

 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 字符串)时才应使用。如果您的原生类型实际上是原生端写入的缓冲区,则com.sun.jna.Memory在从 Java 调用原生代码以及Pointer在回调中从原生代码接收数据时,您需要使用原始数组或 NIO 直接缓冲区。

由于您在回调中使用它,因此参数必须是 type Pointer。然后,您可以使用各种Pointer访问方法从内存中读取或写入。

您不能java.nio.Buffer在回调中使用原始数组,因为本机代码无法构造这些对象,并且String不合适,因为您无法更改 Java 的内容String

于 2012-05-04T16:31:45.337 回答
0

不需要在java中更改参数,这会传递一个String。您必须更改 c 中的代码才能接收没有指针的字符串。

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

.t_str()适用于builder c ++ 2010,但可以将字符串转换为char *其他版本的c

于 2017-08-05T04:33:24.720 回答