下面是二个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数据类型应该如何对应

解决方案 »

  1.   

    int GenerateKeyA(long AuthenticationCode, long CardNo, long SerialNo, String KeyBuffer);int GenerateAuthenticationCode(short sicCode, long CardNo, long SerialNo ,long[] AuthenticationCode);
    long *AuthenticationCode我忘了是代表什麼了
      

  2.   

    Java 类型C 类型原生表现
    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 相同
      

  3.   

    jdk\include\jni.h  lz研究下吧。
      

  4.   

    这样是不行的 GenerateKeyA这样声明 调用出错了我是这样声明的调用是成功了 但是总觉得返回结果不是我想要的int GenerateKeyA(byte[]AuthenticationCode, byte[]CardNo, byte[]SerialNo,String KeyBuffer);
      

  5.   


    c类型如何转化为java类型。
      

  6.   

    貌似没找到无符号long对应java什么类型,网上也找不到。
      

  7.   

    32位下的unsigned long就是unsigned int,用java的long就可以了。
    64位下就麻烦了。一般来说,lang这个类型,不应该在C下用。
      

  8.   


    32位下的unsigned long就是unsigned int
    我试了一下
    int GenerateKeyA(int AuthenticationCode, int CardNo, int SerialNo,int[] KeyBuffer);这样是可以调用的,但是CardNo这个字段长度是卡号 很长的用int无法传参数了 但是用long调用会出错的
      

  9.   

    我想知道lz是如何用java调用的。
      

  10.   

    jna
    比jni好用些只用写相应的接口就可以了
      

  11.   

    我一般都是通过java写natvie方法,生成头文件,然后用c++实现头文件里的方法,用头文件里的方法调用的第三方dll的。
      

  12.   

    他是别人有一个现成的dll给他调用,所以用jna比较好,有时候我用jna调用一下windows的api还比较好使
      

  13.   

    我意思是用java调用我写的dll,然后我写的dll调用第三方dll
      

  14.   

    找方法,我告诉你一个简单方法,很实用,很简单,打开命令窗口,输入dumpbin回车键,如果没有反应,就在vc++6.0的安装目录,下找到vc98的文件下的bin目录下找VCVARS32.BAT这个文件,把他拖到命令窗口,按回车键,在输入dumpbin,就可以了,在你的动态库dll目录下输入dumpbin -exports 动态库名称就完成了,里面有动态库里面的所有方法,可以直接用,绝对正确,
    还有类型匹配,你可以看看这个,http://code.google.com/p/shendl/downloads/list
    自己下载,记得给分哦
      

  15.   

    JNA直接给你实现了那个中间dll
      

  16.   

    线在java中写好native方法,   编译后, 在用 javah -jni 编译这个类,   把生成的.h文件拿去实现, 编译成dll
    在对应类中加入   System.loadLibrary() 就可以调用了, 
      

  17.   


    方法名字是有,但是如何看参数以及类型呢?你这个Depends也可以做啊。
      

  18.   

    C/C++中
    unsigned long 对应java的数据类型是 NativeLong 但是unsigned long * 这个指针对应java是什么类型呢?String 还是byte[]数组 还是char[]数组 还是其它?
      

  19.   

    NativeLong long 平台依赖(32 或64 位整数)JNA有这个类型
    java的String对应c的char*
      

  20.   

    typedef struct _PCI_COMMON_CONFIG {
      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中怎么对应?