下面这条函数又应该怎么转化成对应的java的函数int CVR_ReadBaseMsg (
  unsigned char *pucCHMsg, unsigned int *puiCHMsgLen,    unsigned char *pucPHMsg, unsigned int *puiPHMsgLen, 
  int nMode) 

解决方案 »

  1.   

    unsigned char * ==>  byte[]
    Java:
    int readBaseMsg (
    byte[] pucCHMsg, byte[] puiCHMsgLen, byte[] pucPHMsg, byte[] puiPHMsgLen,  
    int nMode) 
      

  2.   

    就是C中的这样一条函数
    int GetPeopleName(char *strTmp, int *strLen)翻译成java函数应该是怎么样的?
      

  3.   

    翻译??????????????????????????????????????????????????一定要翻译的话:
    public static int getPeopleName(String strTmp)java/c#不必传递数组、字符串的长度。
      

  4.   

    char*  对应byte[], 
    int 对应 int ,不区分符号.int CVR_ReadBaseMsg (
    byte[] pucCHMsg, int puiCHMsgLen, byte[] pucPHMsg, int puiPHMsgLen, 
    int nMode)
      

  5.   

    我那个是int*啊另外问一下楼上几位高手
    int GetPeopleName(char *strTmp, int *strLen)
    这条C函数可以取得名字、名字的长度;还有返回是否获取成功public static int getPeopleName(String strTmp)
    可以吗?这个感觉只是将strTmp传进getPeopleName函数吧,如果getPeopleName函数里面修改了strTmp,调用这条函数后,能返回修改后的结果吗?
      

  6.   


    你这个在Java里面不是很好办,因为Java不能像C++那样可以通过参数返回值。所以,当name为要取得的值的时候,还是改成这样的好:public static String getPeopleName();
      

  7.   

    在Java里面太难办了。C/C++可以从参数获得返回值,Ruby,Python可以返回多值,可怜的Java,你返回一个结构体吧 
      

  8.   

    之前我在VC论坛发了个帖子,别人要求的java接口有4个java文件,分在两个文件夹下,能够根据他们改成jni标准的类,然后生成对应的头文件吗?
      

  9.   


    java我不懂,等下我将原来的dll改成jni标准的dll,还得再用java将它封装成别人要的接口,这个也太麻烦啦
    关键是我还不知道怎么用java封装这个dll,实现别人提供的接口
      

  10.   


    Java本来就是一个public的class/interface是一个单独的文件的。至于生成的.h文件,你可以手工合并到一起,(不合并也可以,include呗~)
      

  11.   


    写JNI,不要安装C的想法办,安装Java的想法走。(也就是说,别管什么char*, byte[]的,字符串就是String类,int就是int。)
    写native的Java API先,然后实现对应的C文件即可。
      

  12.   

    javac,javah这两个命令已经会了关键是怎么把别人的两个文件夹下的四个java文件改成jni标准的类
      

  13.   

    参数是个对象,
    class Param {
      private String x;
      private String y;
      private String z;
      // ......
    }public void foo(Param p) {
      p.x = ...
    }
      

  14.   

    javah命令,把带有native签名的方法,输出.h文件
      

  15.   

    如果我在java类中定义了
        public char[] _Data;
        public native short rf_read(int icdev,short _Adr);
        public char[] getData()
        {
            return _Data;
        }然后用javac、javah生成头文件后,再根据这个头文件创建对应的cpp文件,在cpp文件中,我可以给_Data赋值吗?该怎么赋值,是直接strcpy(_Data,"ABCDE");这样吗?
      

  16.   

    用byte[] 而不是 char[], 
      

  17.   

    好吧,如果改成byte[] _Data我在最后创建的cpp中是否可以直接调用_Data
    给它赋值?
      

  18.   

    不可以,native的只有那个方法。别的不行。
      

  19.   

    那我应该怎么在rf_read调用设备dll的rf_read函数,把得到的数据填充到_Data中呢?
      

  20.   


    为什么总想让这C代码操作_Data,而不是Java代码调用C代码,得到byte[]后,由Java填充_Data呢?
      

  21.   

    你的意思还是将
    public native short rf_read(int icdev,short _Adr);定义成
    public native byte[] rf_read(int icdev,short _Adr);
    直接返回读取的结果?
    如果我还想返回调用rf_read成功与否的错误代码,是不是又要把返回值定义成结构体?
      

  22.   

    JNI中,你再定义结构体什么的,是给自己找麻烦,尽量用int,string这些基本的类型。
      

  23.   

    谢谢啊你能不能直接告诉我,如果我的rf_read如果成功读取了,我希望错误代码为0,并且得到读取的字符串;如果不成功,返回相应的整形错误代码;我怎么定义rf_read能同时得到错误代码和字符串,或者是否我应该在多定义一条函数,例如GetErrorCode?
      

  24.   


    嗯,建议你一条C语言完成的,在Java的native那里,用几个API实现好了。
      

  25.   

    好的,谢谢,再请教一下
    native函数,java别的类是否可以直接调用?
      

  26.   

    当然了。Java可以调用native类,实际上相当于JVM帮你LoadLibraray and GetProcAddress。
      

  27.   

    哦,谢谢,如果我的dll有个接口是
    int GetABCD(char* A, char* B, char* C, char* D)我的java类中就应该写成:
    public native byte[] GetA();
    public native byte[] GetB();
    public native byte[] GetC();
    public native byte[] GetD();
    public native int GetErrorCode();生成对应的头文件后,我应该在cpp中的GetA、GetB、GetC、GetD中哪一条函数中调用GetABCD呢?
    难道是每个函数中都调用,然后只取出本函数关注的值?
      

  28.   


    这个就看你想怎么做?你需要自己定义一个native方法,定义好里面的参数,然后用javah生成头文件,用该头文件写个dll(这个叫第二方dll,java直接可调用的),在这个dll中去调用你的那个int GetABCD(char* A, char* B, char* C, char* D)接口的dll(这个叫第三方dll,java不直接调用的),所以只要保证第二方dll调用第三方dll的参数类型正确即可,也就是说java和第二方dll的参数可以根据需要来定,可以和第三方dll的参数一致,也可以不一致,只要第二方dll调用第三方dll后,能把结果传给java就可以了。一般情况,使用一致的参数类型比较方便,即java调用第二方dll可以使用java的char[](这里经过javah生成头文件后会变为对应的JNI类型jcharArray),第二方dll调用第三方dll时可以使用C的char[]定义局部变量,把第二方的jcharArray的值复制到局部变量的char[],调用第三方dll,然后再把局部变量的char[]复制回第二方dll参数的jcharArray
    jcharArray如何操作,可以查看javadoc的JNI Function一章