C语言标准的函数int GetPeopleName(char *strTmp, int *strLen),在java中怎么表示?

King_hhuang 2011-06-15 04:09:06
下面这条函数又应该怎么转化成对应的java的函数

int CVR_ReadBaseMsg (
unsigned char *pucCHMsg, unsigned int *puiCHMsgLen, unsigned char *pucPHMsg, unsigned int *puiPHMsgLen,
int nMode)
...全文
474 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 king_hhuang 的回复:]
哦,谢谢,如果我的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[] Get……
[/Quote]

这个就看你想怎么做?你需要自己定义一个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一章
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
哦,谢谢,如果我的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呢?
难道是每个函数中都调用,然后只取出本函数关注的值?


healer_kx 2011-06-15
  • 打赏
  • 举报
回复
当然了。Java可以调用native类,实际上相当于JVM帮你LoadLibraray and GetProcAddress。
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
好的,谢谢,再请教一下
native函数,java别的类是否可以直接调用?
healer_kx 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 king_hhuang 的回复:]

谢谢啊

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

嗯,建议你一条C语言完成的,在Java的native那里,用几个API实现好了。
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
谢谢啊

你能不能直接告诉我,如果我的rf_read如果成功读取了,我希望错误代码为0,并且得到读取的字符串;如果不成功,返回相应的整形错误代码;我怎么定义rf_read能同时得到错误代码和字符串,或者是否我应该在多定义一条函数,例如GetErrorCode?
healer_kx 2011-06-15
  • 打赏
  • 举报
回复
JNI中,你再定义结构体什么的,是给自己找麻烦,尽量用int,string这些基本的类型。
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
你的意思还是将
public native short rf_read(int icdev,short _Adr);

定义成
public native byte[] rf_read(int icdev,short _Adr);
直接返回读取的结果?
如果我还想返回调用rf_read成功与否的错误代码,是不是又要把返回值定义成结构体?
healer_kx 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 king_hhuang 的回复:]

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

为什么总想让这C代码操作_Data,而不是Java代码调用C代码,得到byte[]后,由Java填充_Data呢?
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
那我应该怎么在rf_read调用设备dll的rf_read函数,把得到的数据填充到_Data中呢?
healer_kx 2011-06-15
  • 打赏
  • 举报
回复
不可以,native的只有那个方法。别的不行。
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
好吧,如果改成byte[] _Data

我在最后创建的cpp中是否可以直接调用_Data
给它赋值?
healer_kx 2011-06-15
  • 打赏
  • 举报
回复
用byte[] 而不是 char[],
King_hhuang 2011-06-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");这样吗?
shine333 2011-06-15
  • 打赏
  • 举报
回复
javah命令,把带有native签名的方法,输出.h文件
shine333 2011-06-15
  • 打赏
  • 举报
回复
参数是个对象,
class Param {
private String x;
private String y;
private String z;
// ......
}

public void foo(Param p) {
p.x = ...
}
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
javac,javah这两个命令已经会了

关键是怎么把别人的两个文件夹下的四个java文件改成jni标准的类
healer_kx 2011-06-15
  • 打赏
  • 举报
回复
javah,
King_hhuang 2011-06-15
  • 打赏
  • 举报
回复
他那个接口文件我也不太清楚啊,怎么生成对应的头文件啊,可否麻烦你帮我生成一下头文件,然后我在去VC里面弄弄?
healer_kx 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 king_hhuang 的回复:]

引用 9 楼 healer_kx 的回复:
在Java里面太难办了。

C/C++可以从参数获得返回值,

Ruby,Python可以返回多值,可怜的Java,你返回一个结构体吧。。。 。。。


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

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

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧