楼主可否能把代码填全一些
是在地层实现中把结构体中内容都得到后,返回给调用者(Java对象),通常这些是java 对象的成员变量

解决方案 »

  1.   

    楼上的,难道这还不够全吗??????
    那个C函数本来就是人家封装好在DLL中的,现在Struct结构体,函数调用接口都有了,还差什么吗???????????
      

  2.   

    我现在就是不知道怎么把C中的BYTE类型,在JNative返回值中取出来!!!!
      

  3.   

    这是两个空间的东西 一个 C 一个java,要两者之间能够交互,应该是要通过第三方,就是C 不能直接得到java中的变量,java也不能直接得到C的东西。我是这么想的呵呵,所以想看下你的C 实现代码和JNative这个类
      

  4.   

    都说那个函数是别人封装好在DLL里面了,只提供给我结构体和函数接口!
    我是没有实现JNative类的,我是用
    Pointer pstruct = new Pointer(new HeapMemoryBlock(16));
    jnative.setParameter(4, pstruct);
    来定义指针类的,因为C语言的test_Login是返回值的结构体,不需要setparamet传参数。JNative类我也试过,C的BYTE类型我对应Java的long类型,比如:
    C:BYTE byAlarmInPortNum; //输入个数
    Java:long byAlarmInPortNum; //输入个数但是用jnative.getNextLong()获取返回值跟实际值完全不一样!!!
     
      

  5.   

    但是C语言结构体中:
    typedef struct {
    BYTE sSerialNumber[SERIALNO_LEN]; //序列号
    的那个序列号我用JNative的指针pstruct.getAsString()获取结构体的返回值是正确的
    但是结构体除序列号外的其他参数都获取不正确,getNextInt()、getNextLong()、getNextByte()、getNextShort()我都试过了,获取返回来的值都是不对的!!!!!
      

  6.   

    to vclongking:
    取不了值应该不可能,那为什么结构体的第一个“序列号”参数值可以取得正确,应该是数据类型不能匹配的问题!
      

  7.   

    Pointer pstruct = new Pointer(new HeapMemoryBlock(16));
    首先确定这个分配的空间足够吗?考虑到结构体的数据对齐,而且不同编译器还不一样
      

  8.   

    如果SERIALNO_LEN是10的话至少得分配22最好是36
      

  9.   

    SERIALNO_LEN是48来的!
    现在我分配给它的空间是:
    Pointer pstruct = new Pointer(new HeapMemoryBlock(48*7));
    这个48*7=336应该够了吧,我想应该不是空间的问题,如果是空间的问题,为什么第一个参数“序列号”返回值是正确的,这个“序列号”就是一串长度为48的字符串!现在取上来的“序列号”是完全正确的.
      

  10.   

                 Pointer p2 = new Pointer(new HeapMemoryBlock(1024));  
                 p2.setIntAt(0, 100);  
    看到有人这么用是不是有相反的取法?
      

  11.   

    BYTE sSerialNumber[SERIALNO_LEN]; //序列号  pstruct.getAsString(0)
    BYTE byAlarmInPortNum; //输入个数           pstruct.getAsInt(1)?
    BYTE byAlarmOutPortNum; //输出个数           ..
    BYTE byDiskNum; //                           ..
    BYTE byDVRType; //类型,
    BYTE byChanNum; //
    BYTE byStartChan; //
      

  12.   

    to vclongking:
    估计是数据类型不匹配,但是C语言的BYTE类型对应JAVA的什么类型呢?还有就是Pointer只有这败类型:getNextInt()、getNextLong()、getNextByte()、getNextShort()啊!
    to SkyGray:
    Pointer的getAsString方法好像没有参数吧,我这里只能是空参数,不能pstruct.getAsString(0)这样用!
      

  13.   


    得到的结果跟以下:
    Pointer p2 = new Pointer(new HeapMemoryBlock(48*7));  
      p2.setIntAt(0, p2.getSize());得到的结果一样,不是不对,不知道怎么取那个数据类型了!!!
      

  14.   

    C BYTE 8 bit ->java Byte 8 bit
     
      

  15.   

    怎么转?
    C里面的那个BYTE值是16
    JNative通过this.getPointer().getAsByte(0)取出的值是68
      

  16.   

    你取得不对吧对于取出来的byte直接就可以强转成int
      

  17.   

    都一样的,用getAsByte(0)取出来后得68,再强制转int,结果还是68!!!!!
    用getAsInt(0)取也是一样是68!!!!!
      

  18.   

    就没考虑过把getAsInt(0) 括号里的0换换么?
    getAs其实就有一个数据转换的过程了,所以不论你AsByte或者AsInt,只要里面的数据位可以满足转换,得到的结果可能会一样,我猜的啊呵呵
      

  19.   

    getAsInt(0)括号里的参数都换过了,从0换到8都试过,没一个是对的!!!!!
      

  20.   

    android 可以调用dll? android的loader和linker不是自己做的吗?不是标准的呀我调用第三方的so搞了半天都没搞定。另外,JNI是要自己写的啊,第三方的库里面不会帮你实现的啊比如本来一个库函数,叫int setValue(int i)改成jni的方式是:
    jint jsetValue(JNIEnv* env, jobject clazz, jint i)
    {
        setValue(i);
    }
    java端还要自己建个类
    class jNative{
      static {
            System.loadLibrary("jNative_runtime");
        }
      
      public static native int setValue(int i);
    }
      

  21.   

    楼上的,不知道你在说什么,我现在是用JNative来调用DLL函数,不是用JNI啊!!!!!
      

  22.   

    android 调用C函数你不用JNI怎么用?android的java和虚拟机都是自己弄的,我到现在还没见过在android上不通过jni可以调用native C的方法。而且dll能否在android中使用还不太清楚,也许是可以的。
      

  23.   

    楼上的,我好像从头到尾都没有说过我的DLL是用native c来写的吧!
    我这是标准的C语言写的DLL,而且我也不是用Android来调用DLL!!!
      

  24.   

    晕,那你发在android版干嘛啊~
      

  25.   

    我一直好奇Android中程序是怎么调用windows下的DLL的。
      

  26.   

    byte Data[] = pstruct.getMemory();
    楼主自己测试一下吧