我是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设置值...
你能解决这个问题吗?请:))。
对不起我的解释。
谢谢。
答案 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 *