下面是二个c 的中dll文件接口中提供的二个方法 int GenerateKeyA(unsigned long AuthenticationCode, unsigned long CardNo, unsigned long SerialNo, unsigned char *KeyBuffer);int GenerateAuthenticationCode(unsigned short sicCode, unsigned long CardNo, unsigned long SerialNo unsigned long *AuthenticationCode);想在java中声明, 然后通过 CLibrary.INSTANCE进行调用
请问我该如何转化方法,不太清楚java与c数据类型应该如何对应
请问我该如何转化方法,不太清楚java与c数据类型应该如何对应
long *AuthenticationCode我忘了是代表什麼了
boolean int 32 位整数(可定制)
byte char 8 位整数
char wchar_t 平台依赖
short short 16 位整数
int int 32 位整数
long long long, __int64 64 位整数
float float 32 位浮点数
double double 64 位浮点数
Buffer
Pointer
pointer 平台依赖(32 或64 位指针)
<T>[] (基本类型的数组)
pointer
array
32 或64 位指针(参数/返回值)
邻接内存(结构体成员)
Java 类型C 类型原生表现
String char* \0 结束的数组(native encoding or jna.encoding)
WString wchar_t* \0 结束的数组(unicode)
String[] char** \0 结束的数组的数组
跨平台、跨语言调用原则:
尽量使用基本、简单的数据类型;
尽量少跨平台、跨语言传递数据!
如果有复杂的数据类型需要在Java 和原生函数中传递,那么我们就必须在Java 中模拟
大量复杂的原生类型。这将大大增加实现的难度,甚至无法实现。
如果在Java 和原生函数间存在大量的数据传递,那么一方面,性能会有很大的损失。
更为重要的是,Java 调用原生函数时,会把数据固定在内存中,这样原生函数才可以访问这
些Java 数据。这些数据,JVM 的GC 不能管理,会造成内存碎片。
如果在你需要调用的动态链接库中,有复杂的数据类型和庞大的跨平台数据传递。那么
你应该另外写一些原生函数,把需要传递的数据类型简化,把需要传递的数据量简化。
JNA模拟结构体
在原生代码中,结构体是经常使用的复杂数据类型。这里我们研究一下怎样使用JNA
模拟结构体。
例2 使用JNA调用使用Struct的C函数
假设我们现在有这样一个C 语言结构体
struct UserStruct{
long id;
wchar_t* name;
int age;
};
使用上述结构体的函数
#define MYLIBAPI extern "C" __declspec( dllexport )
WString[] wchar_t** \0 结束的宽字符数组的数组
Structure
struct*
struct
指向结构体的指针(参数或返回值) (或者明确指定是结构体指
针)
结构体(结构体的成员) (或者明确指定是结构体)
Union union 等同于结构体
Structure[] struct[] 结构体的数组,邻接内存
Callback <T> (*fp)() Java 函数指针或原生函数指针
NativeMapped varies 依赖于定义
NativeLong long 平台依赖(32 或64 位整数)
PointerType pointer 和Pointer 相同
c类型如何转化为java类型。
64位下就麻烦了。一般来说,lang这个类型,不应该在C下用。
32位下的unsigned long就是unsigned int
我试了一下
int GenerateKeyA(int AuthenticationCode, int CardNo, int SerialNo,int[] KeyBuffer);这样是可以调用的,但是CardNo这个字段长度是卡号 很长的用int无法传参数了 但是用long调用会出错的
比jni好用些只用写相应的接口就可以了
还有类型匹配,你可以看看这个,http://code.google.com/p/shendl/downloads/list
自己下载,记得给分哦
在对应类中加入 System.loadLibrary() 就可以调用了,
方法名字是有,但是如何看参数以及类型呢?你这个Depends也可以做啊。
unsigned long 对应java的数据类型是 NativeLong 但是unsigned long * 这个指针对应java是什么类型呢?String 还是byte[]数组 还是char[]数组 还是其它?
java的String对应c的char*
USHORT VendorID;
USHORT DeviceID;
USHORT Command;
USHORT Status;
UCHAR RevisionID;
UCHAR ProgIf;
UCHAR SubClass;
UCHAR BaseClass;
UCHAR CacheLineSize;
UCHAR LatencyTimer;
UCHAR HeaderType;
UCHAR BIST;
union {
struct {
ULONG BaseAddresses[6];
ULONG Reserved1[2];
ULONG ROMBaseAddress;
ULONG Reserved2[2];
UCHAR InterruptLine;
UCHAR InterruptPin;
UCHAR MinimumGrant;
UCHAR MaximumLatency;
} type0;
} u;
UCHAR DeviceSpecific[192];
} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;其中
typedef unsigned short USHORT;
typedef unsigned char UCHAR;
typedef unsigned long ULONG;这个结构体在java中怎么对应?