小弟初识jni,要用一个c的dll库,其中一个函数接口为:
char Login(struct Login_data * Login_result);
struct Login_data
{
char server[40];
char username[24];
char passwd[16];
}
要在java中调用,不知道怎么搞,我想在java中结构体直接写成类:
public class Login_Data
{
public char server[]= new char[40];
public char username[]= new char[24];
public char passwd[] = new char[16];
}
我想有两种方法:
1.直接把java的类传给dll:
private native char login(Login_Data loginData);但是我觉得这应该不行
2.写一个中间的dll来调用提供login(char* server,char* username,char* passwd),但是不知道怎么申明这个native函数,private native char login(a,b,c);并且a,b,c要带回一些值.
谢谢各位,不知道有没有做过类似的朋友,交流一下,望不吝赐教啊!
char Login(struct Login_data * Login_result);
struct Login_data
{
char server[40];
char username[24];
char passwd[16];
}
要在java中调用,不知道怎么搞,我想在java中结构体直接写成类:
public class Login_Data
{
public char server[]= new char[40];
public char username[]= new char[24];
public char passwd[] = new char[16];
}
我想有两种方法:
1.直接把java的类传给dll:
private native char login(Login_Data loginData);但是我觉得这应该不行
2.写一个中间的dll来调用提供login(char* server,char* username,char* passwd),但是不知道怎么申明这个native函数,private native char login(a,b,c);并且a,b,c要带回一些值.
谢谢各位,不知道有没有做过类似的朋友,交流一下,望不吝赐教啊!
解决方案 »
- 枚举类型究竟是什么呢,有什么作用?
- 怎样用java程序打开酷狗播放器啊?
- 扫雷游戏遇到的问题
- 物业管理程序
- 为什么要用MM 和 HH ,而不用小写
- 求一个数据加密的算法!(在线等)
- 怎样将word文件转换为html格式,请大哥给指点,深表感谢!怎样操作二进制数据?
- 高分求书:“Design Pattern”!!
- 用什么方法可以让JAVA生成N多个乱七八糟的而且有些还带$符号的CLASS文件呢?
- jTextField的focus
- 为什么HQL查出的结果和SQL查询的结果不一样,是不是HIBERNATE应该有什么配置的问题,
- 在linux上,使用File.length() 有时会返回0, 但文件实际有内容。求各位大哥大姐帮忙.
login(char* server,char* username,char* passwd)
private native char login(char *server...);?
刚才写了下 char* server好像不行啊
Java C/C++
boolean[ ] JbooleanArray
byte[ ] JbyteArray
char[ ] JcharArray
short[ ] JshortArray
int[ ] JintArray
long[ ] JlongArray
float[ ] JfloatArray
double[ ] JdoubleArray
对于上述类型数组,有一组函数与其对应。以下函数中Xxx为对应类型。
xxx * GetXxxArrayElements(xxxArray array, jboolean *isCopy)
产生一个指向Java数组元素的C指针。不再需要时,需将此指针传给ReleaseXxxArrayElemes。参数:array数组对象
isCopy如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。
例如: jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy)
void ReleaseXxxArrayElements(xxxArray array,xxx *elems, jint mode)
通知虚拟机不再需要从GetXxxArrayElements得到的指针。参数:array数组对象
elems不再需要的指向数组元素的指针
mode0=在更新数组元素后释放elems缓冲器
JNI_COMMIT=在更新数组元素后不释放elems缓冲器
JNI_ABORT=不更新数组元素释放elems缓冲器
例如:void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems, jint mode)
xxxArray NewXxxArray(jsize len)
产生一个新的数组,通常在反值类型为数组型时用到参数:len数组中元素的个数。
例如:jbooleanArray NewBooleanArray(jsize len)
你在java中声明一个native方法,在这个类用javah生成的头文件中对应的函数,在你写的中间dll文件中改函数中调用你那个login函数不就行了!eg:
native方法:public native void login1(String str);
生成的头文件中对应的函数为:JNIEXPORT void JNICALL Java_class_login1(JNIEnv *, jobject, jstring);
在中间dll文件中实现Java_class_login1(JNIEnv *, jobject, jstring);这个函数,在这个函数中直接调用char Login(struct Login_data * Login_result);
不行么?
对方接受的是jstring类型
然后可以很方便地转成char*[]
然后在自己写的dll中
char* GetXxxArrayElements(charArray array, jboolean *isCopy)得到char指针,填写信息,这里isCopy是设置成JNI_FALSE还是JNI_TRUE呢?我个人决的事JNI_TRUE,因为是用完释放的时候是释放指针的副本吧?
你的意思是在中间的dll中对string进行分拆,对不对?
但是这个只是其中的一个struct,还有很多其他的,并且其组成元素类型不相同
晕!