急问java调用dll库,怎么传结构体指针获得返回值?谢谢,在线等,分数不够再加!!!

cool_ice 2005-04-27 10:07:33
小弟初识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要带回一些值.
谢谢各位,不知道有没有做过类似的朋友,交流一下,望不吝赐教啊!
...全文
675 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cool_ice 2005-04-29
  • 打赏
  • 举报
回复
error LNK2001: unresolved external symbol _GetCharArrayElements
晕!
dj0517 2005-04-28
  • 打赏
  • 举报
回复
喔喔,帮你顶!!!
cool_ice 2005-04-27
  • 打赏
  • 举报
回复
对了,如果是long类型的怎么让它去的返回值?这些struct中主要是long,char[],以及char类型
cool_ice 2005-04-27
  • 打赏
  • 举报
回复
to: zhutouzip(Speak out!-shyboy) ( )
你的意思是在中间的dll中对string进行分拆,对不对?
但是这个只是其中的一个struct,还有很多其他的,并且其组成元素类型不相同
cool_ice 2005-04-27
  • 打赏
  • 举报
回复
private native char login(JcharArray server,JcharArray username,JcharArray passwd);?
然后在自己写的dll中
char* GetXxxArrayElements(charArray array, jboolean *isCopy)得到char指针,填写信息,这里isCopy是设置成JNI_FALSE还是JNI_TRUE呢?我个人决的事JNI_TRUE,因为是用完释放的时候是释放指针的副本吧?
jFresH_MaN 2005-04-27
  • 打赏
  • 举报
回复
是的,用三个String也是可以的
对方接受的是jstring类型
然后可以很方便地转成char*[]
飞行的兔子 2005-04-27
  • 打赏
  • 举报
回复
这样没必要写一个单独的类来和这个struct对应!
你在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);
不行么?
jFresH_MaN 2005-04-27
  • 打赏
  • 举报
回复
可以使用jcharArray类型,贴个好东西给你看

对于数组型参数,
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)
cool_ice 2005-04-27
  • 打赏
  • 举报
回复
可以啊,但是java里面怎么申明
private native char login(char *server...);?
刚才写了下 char* server好像不行啊
jFresH_MaN 2005-04-27
  • 打赏
  • 举报
回复
在dll里面加一个函数不可以吗?
login(char* server,char* username,char* passwd)

62,614

社区成员

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

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