Widze ze niektorzy sie madrza i glupio odpisuja jak zapytalem ile bitow ma typ unsigned char w C. Ja pisze w Javie i wiem, ze zakres zmiennych w jezyku Java jest odgornie ustalony. Inaczej jest w przypadku programów C i C++ ktore uzywaja typow liczbowych najbardziej efektownych dla danego procesora...
Reasumujac pisze teraz program w Javie gdzie musze skorzystac z JNI i kilku funkcji napisanych w c++. Czy ktos uzywal kiedys xFunction i moze mi powiedziec co jest nie takz moim kodem???
Otrzymuje taki blad:
Exception in thread "main" com.excelsior.xFunction.IllegalSignatureException: Il
legal type to make an Argument: byte
at com.excelsior.xFunction.xFunction.parseSignature(xFunction.java:209)
at com.excelsior.xFunction.xFunction.<init>(xFunction.java:30)
at Start.main(Start.java:7)
a moje pliki wygladaja nastepujaco:
defdll.h:
#define GXAPI extern "C" __declspec(dllimport)
GXAPI BOOL WINAPI GxSetEachAmp(UINT nCh, GX_EACHAMP* pAmp);
typedef struct {
BYTE range;
BYTE sample;
BYTE use;
BYTE misc1;
WORD misc2;
WORD misc3;
double xpc;
} GX_EACHAMP;
#define BYTE unsigned char
#define WORD unsigned short
#define BOOL bool
Start.java:
import com.excelsior.xFunction.*;
public class Start
{
public static void main(String[] args) throws xFunctionException
{
xFunction GxSetEachAmp = new xFunction("Gx02", "int GxSetEachAmp(int,GX_EACHAMP*)");
GX_EACHAMP Gx_EachAmp = new GX_EACHAMP();
//GxSetEachAmp
Gx_EachAmp.range = 0;
Gx_EachAmp.sample = 6;
Gx_EachAmp.use = 0;
Gx_EachAmp.misc1 = 8;
Gx_EachAmp.misc2 = 3;
Gx_EachAmp.misc3 = 0;
Gx_EachAmp.xpc = 2.1;
int Gx_SetEachAmp_result = ((Integer)GxSetEachAmp.invoke(new Argument(0),Pointer.createPointerTo(Gx_EachAmp))).intValue();
}
}
GX_EACHAMP.java:
import com.excelsior.xFunction.*;
class GX_EACHAMP extends Structure
{
byte range; // Range information
byte sample; // Sampling frequency information
byte use; // Channel ON/OFF information
short misc1; // Other information 1
short misc2; // Other information 2
short misc3; // Other information 3
double xpc; // Coefficient information (write only)
public String defineLayout()
{
return "byte range, byte sample, byte use, short misc1, short misc2, short misc3, double xpc";
}
public GX_EACHAMP() {}
}
Czy ktos ma jakis pomysl?