下面这条函数又应该怎么转化成对应的java的函数int CVR_ReadBaseMsg (
unsigned char *pucCHMsg, unsigned int *puiCHMsgLen, unsigned char *pucPHMsg, unsigned int *puiPHMsgLen,
int nMode)
unsigned char *pucCHMsg, unsigned int *puiCHMsgLen, unsigned char *pucPHMsg, unsigned int *puiPHMsgLen,
int nMode)
Java:
int readBaseMsg (
byte[] pucCHMsg, byte[] puiCHMsgLen, byte[] pucPHMsg, byte[] puiPHMsgLen,
int nMode)
int GetPeopleName(char *strTmp, int *strLen)翻译成java函数应该是怎么样的?
public static int getPeopleName(String strTmp)java/c#不必传递数组、字符串的长度。
int 对应 int ,不区分符号.int CVR_ReadBaseMsg (
byte[] pucCHMsg, int puiCHMsgLen, byte[] pucPHMsg, int puiPHMsgLen,
int nMode)
int GetPeopleName(char *strTmp, int *strLen)
这条C函数可以取得名字、名字的长度;还有返回是否获取成功public static int getPeopleName(String strTmp)
可以吗?这个感觉只是将strTmp传进getPeopleName函数吧,如果getPeopleName函数里面修改了strTmp,调用这条函数后,能返回修改后的结果吗?
你这个在Java里面不是很好办,因为Java不能像C++那样可以通过参数返回值。所以,当name为要取得的值的时候,还是改成这样的好:public static String getPeopleName();
java我不懂,等下我将原来的dll改成jni标准的dll,还得再用java将它封装成别人要的接口,这个也太麻烦啦
关键是我还不知道怎么用java封装这个dll,实现别人提供的接口
Java本来就是一个public的class/interface是一个单独的文件的。至于生成的.h文件,你可以手工合并到一起,(不合并也可以,include呗~)
写JNI,不要安装C的想法办,安装Java的想法走。(也就是说,别管什么char*, byte[]的,字符串就是String类,int就是int。)
写native的Java API先,然后实现对应的C文件即可。
class Param {
private String x;
private String y;
private String z;
// ......
}public void foo(Param p) {
p.x = ...
}
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");这样吗?
给它赋值?
为什么总想让这C代码操作_Data,而不是Java代码调用C代码,得到byte[]后,由Java填充_Data呢?
public native short rf_read(int icdev,short _Adr);定义成
public native byte[] rf_read(int icdev,short _Adr);
直接返回读取的结果?
如果我还想返回调用rf_read成功与否的错误代码,是不是又要把返回值定义成结构体?
嗯,建议你一条C语言完成的,在Java的native那里,用几个API实现好了。
native函数,java别的类是否可以直接调用?
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呢?
难道是每个函数中都调用,然后只取出本函数关注的值?
这个就看你想怎么做?你需要自己定义一个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一章