2012-05-04 6 views
0

Я немного проблема с JNA.Строка, переданная в параметре

Мой код:

заголовок с:

#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 е

Я должен обрабатывать rxbuf в Java, прежде чем закончить функцию и после того, как я обрабатывать rxbux ан C, но я не прибывают, чтобы иметь значение набор в Java в функции в C ...

Помогите с этой проблемой? пожалуйста :).

Извините за мое объяснение.

спасибо.

ответ

0

Вы должны использовать только String, когда ваш собственный тип const char * (строка C только для чтения). Если ваш собственный тип на самом деле является буфером, на который пишет собственная сторона, вам необходимо использовать примитивный массив com.sun.jna.Memory или прямой буфер NIO при вызове собственного кода с Java и Pointer при приеме данных из собственного кода в обратном вызове.

Поскольку вы используете это в обратном вызове, параметр должен быть типа Pointer. Затем вы можете использовать различные методы доступа Pointer для чтения или записи из памяти.

Вы не можете использовать примитивный массив или java.nio.Buffer в обратном вызове, так как нативный код не может строить эти объекты, и String неуместно, потому что вы не можете изменить содержимое Java String.

0

Нет необходимости изменять параметр в java, это передает строку. Вы должны изменить код в c, чтобы получить String без указателя.

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

.t_str() относится к строитель C++ 2010, но может преобразовать строку в char * в других версиях с