当前位置: 技术问答>java相关
关于Java本地接口的问题(JNI),分数不是问题
来源: 互联网 发布时间:2015-09-15
本文导语: 各位老大,有用过JNI的没有?小弟在使用JNI的时候遇到了一点问题,下面是描述: 应用程序主体是由Java编写,有一个外设是PDA,需要将它的数据传输到数据库中或者从数据库中取得数据。 PDA厂商提供了一个COM组件...
各位老大,有用过JNI的没有?小弟在使用JNI的时候遇到了一点问题,下面是描述:
应用程序主体是由Java编写,有一个外设是PDA,需要将它的数据传输到数据库中或者从数据库中取得数据。
PDA厂商提供了一个COM组件,它有几个接口函数来控制PDA上传或者下载数据。
我写了一个动态连接库(DLL),它的功能就是完成将PDA中的数据上传到本地PC形成文件,和取本地文件送到PDA中,DLL里面调用了这个COM组件。
COM组件通过包容,内包了一个COM组件,外面这个COM组件创建一个隐含窗口,接收内包的COM传送的消息,然后将参数记载到一个变量中保存,再通过一个接口函数查询得到这个变量。
外包的这个COM里面创建了一个事件(event1),在在变量更新的时候将这个事件set一下(实际使用的是plus)。
在DLL中创建一个辅助线程,里面openevent1,然后等待这个事件,等到事件之后通过接口函数查询得到COM中的变量值。
在DLL的主线程里面创建一个事件(event2),在辅助线程退出的时候setevent2使主线程继续,然后waitforsingleobject(event2),也就是要在这个函数里面等待辅助线程结束。
这样做从理论上来讲是没有问题的,但是实际上这样做之后,wait(event1)会超时。
如果不使用event2,而用类似messagebox的方式使程序挂起,则wait(event1)就没有问题,可以等到。
需要说明的是这个dll被Java的Applet调用,dll调用COM组件的函数。
上面所叙述的是一种解决办法中遇到的问题,如果能说在DLL中可以直接进行消息循环,接收COM发送的消息,那么就不再需要外包的那个COM了,相应的麻烦事也就没了。
应用程序主体是由Java编写,有一个外设是PDA,需要将它的数据传输到数据库中或者从数据库中取得数据。
PDA厂商提供了一个COM组件,它有几个接口函数来控制PDA上传或者下载数据。
我写了一个动态连接库(DLL),它的功能就是完成将PDA中的数据上传到本地PC形成文件,和取本地文件送到PDA中,DLL里面调用了这个COM组件。
COM组件通过包容,内包了一个COM组件,外面这个COM组件创建一个隐含窗口,接收内包的COM传送的消息,然后将参数记载到一个变量中保存,再通过一个接口函数查询得到这个变量。
外包的这个COM里面创建了一个事件(event1),在在变量更新的时候将这个事件set一下(实际使用的是plus)。
在DLL中创建一个辅助线程,里面openevent1,然后等待这个事件,等到事件之后通过接口函数查询得到COM中的变量值。
在DLL的主线程里面创建一个事件(event2),在辅助线程退出的时候setevent2使主线程继续,然后waitforsingleobject(event2),也就是要在这个函数里面等待辅助线程结束。
这样做从理论上来讲是没有问题的,但是实际上这样做之后,wait(event1)会超时。
如果不使用event2,而用类似messagebox的方式使程序挂起,则wait(event1)就没有问题,可以等到。
需要说明的是这个dll被Java的Applet调用,dll调用COM组件的函数。
上面所叙述的是一种解决办法中遇到的问题,如果能说在DLL中可以直接进行消息循环,接收COM发送的消息,那么就不再需要外包的那个COM了,相应的麻烦事也就没了。
|
小意思,给我发邮件,httpfile@hotmail.com
|
问题可能出在waitforsingleobject上面,如果在UI线程中调用这个函数好像会使消息循环阻塞,我以前编写的vc程序中就出过这个问题,建议不要使用这个函数,可以使用向线程发消息来解决。