参数中传递的字符串

时间:2012-05-04 09:07:24

标签: java jna

我是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);

在java中,

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

所以char* rxbuf == String rxbu f

我必须先在Java中处理rxbuf才能完成该功能,之后我处理rxbux en C但是我没有在C中的函数中使用Java设置值...

你能解决这个问题吗?请:))。

对不起我的解释。

谢谢。

2 个答案:

答案 0 :(得分:0)

当您的本机类型为String(只读C字符串)时,您应该只使用const char *。如果您的本机类型实际上是本机端写入的缓冲区,则在从Java调用本机代码时需要使用基本数组com.sun.jna.Memory或NIO直接缓冲区,并在接收数据时使用Pointer来自回调中的本机代码。

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

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

答案 1 :(得分:0)

没有必要在java中更改参数,这会传递一个String。您必须更改c中的代码以接收没有指针的String。

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

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