我在Jbulider中调用dll,出现了问题,恳请各路英雄帮忙!我建了一个类,里面包含了与dll对应的函数,如下:
package org.HLC.OA.montnets;import java.lang.*;public class mondem
{
public native int SetModemType(int ComNo,int ModemType);
public native int GetModemType(int ComNo);
public native int InitModem (int PortNo);
public native int SendMsg (int PortNo, String strHeader, String strMsg);
public native String[]ReadMsgEx (int PortNo);
public native int SetThreadMode(int Mode); //public native int MonInitModem(String strDev,int num);
//public native int MonSendMsg(int Chno,String strHeader,String strMsg);
//public native String[] MonGetMsg(int Chno);
//public native int MonCloseModem();
static
{
try{
System.out.println("mondem here123!");
System.loadLibrary("mondem");
System.out.println("mondem here too!");
}catch (Exception e){
System.out.println("load Library error:"+e);
}
}
public static void main(String args[])
{
}
}然后在另外的一个类中调用这些函数,如下:
package org.HLC.OA.montnets;import java.lang.*;
public class MsgServer
{
private mondem MyMondem=null;
int rc=0; public void MsgServer(){
System.out.println("here is Ok!"); }
public void Instance(){ //创建Mondem,并且开启线程模式
try{
MyMondem = new mondem();
System.out.println("it is here!!");
//MyMondem.SetModemType(0,0);
//int modemType=MyMondem.GetModemType(0);
//System.out.println("the Mondem type is ="+modemType);
rc = MyMondem.SetThreadMode(1);
System.out.println("设置线程模式");
if (rc == 0)
{
System.out.println("设置线程模式成功");
}
else
{
System.out.println("设置线程模式失败");
return;
}
}catch(Exception ex){
System.out.println("error in MsgServer:"+ex);
}
}
public boolean SendMsg(String tophone,String msg){
Instance();
if((rc=(MyMondem.InitModem(-1)))==0)//初始化短信猫
{
System.out.println("初始化成功");
rc = MyMondem.SendMsg( -1, tophone, msg); //发送一条信息
if (rc == 0)
{
System.out.println("提交成功, rc=" + rc);
return true;
}
}
return false;
}
public static void main(String tophone,String msg)
{
mondem Mytest =new mondem(); //创建一个 mondem 对象, 这个对象最大可以支持64个端口发送
int rc; rc=Mytest.SetThreadMode(1); //开启线程模式
if(rc==0){
System.out.println("设置线程模式成功");
} else {
System.out.println("设置线程模式失败");
return;
}
if((rc=(Mytest.InitModem(-1)))==0)//初始化短信猫
{
System.out.println("初始化成功");
rc=Mytest.SendMsg(-1,tophone,msg); //发送一条信息
if(rc==0){
System.out.println("提交成功, rc="+rc); while(true) //循环等待发送成功,并显示接收信息, Ctrl-C 退出循环
{
String [] s = Mytest.ReadMsgEx(-1);
if(s[0]=="-1") {
System.out.println("-无信息-----");
} else {
System.out.println(s[0]);
System.out.println(s[1]);
System.out.println(s[2]);
}
System.out.println("...."+ //显示各个端口的状态
Mytest.GetStatus(0)+
Mytest.GetStatus(1)+
Mytest.GetStatus(2)+
Mytest.GetStatus(3)+
Mytest.GetStatus(4)+
Mytest.GetStatus(5)+
Mytest.GetStatus(6)+
Mytest.GetStatus(7)+
"...."
);
try{Thread.sleep(5000);}catch(InterruptedException e){} //延时等待
}
} else {
System.out.println("提交错误, rc="+rc);
}
} else {
System.out.println("初始化错误!"+rc);
}
}
}
当我在jsp中调用
MsgServer MobileMsg=new MsgServer();
MobileMsg.Instance();
的时候,MyMondem = new mondem();部分倒是可以通过,并且loadLibrary也没出现异常,就是当继续往下走,到rc = MyMondem.SetThreadMode(1)时,就卡着不动了。
另外,我参考另外一篇帖子,把MonDem.dll设置到了lib\native路径下了,不知道为什么还不行?不能调用DLL中的函数?
package org.HLC.OA.montnets;import java.lang.*;public class mondem
{
public native int SetModemType(int ComNo,int ModemType);
public native int GetModemType(int ComNo);
public native int InitModem (int PortNo);
public native int SendMsg (int PortNo, String strHeader, String strMsg);
public native String[]ReadMsgEx (int PortNo);
public native int SetThreadMode(int Mode); //public native int MonInitModem(String strDev,int num);
//public native int MonSendMsg(int Chno,String strHeader,String strMsg);
//public native String[] MonGetMsg(int Chno);
//public native int MonCloseModem();
static
{
try{
System.out.println("mondem here123!");
System.loadLibrary("mondem");
System.out.println("mondem here too!");
}catch (Exception e){
System.out.println("load Library error:"+e);
}
}
public static void main(String args[])
{
}
}然后在另外的一个类中调用这些函数,如下:
package org.HLC.OA.montnets;import java.lang.*;
public class MsgServer
{
private mondem MyMondem=null;
int rc=0; public void MsgServer(){
System.out.println("here is Ok!"); }
public void Instance(){ //创建Mondem,并且开启线程模式
try{
MyMondem = new mondem();
System.out.println("it is here!!");
//MyMondem.SetModemType(0,0);
//int modemType=MyMondem.GetModemType(0);
//System.out.println("the Mondem type is ="+modemType);
rc = MyMondem.SetThreadMode(1);
System.out.println("设置线程模式");
if (rc == 0)
{
System.out.println("设置线程模式成功");
}
else
{
System.out.println("设置线程模式失败");
return;
}
}catch(Exception ex){
System.out.println("error in MsgServer:"+ex);
}
}
public boolean SendMsg(String tophone,String msg){
Instance();
if((rc=(MyMondem.InitModem(-1)))==0)//初始化短信猫
{
System.out.println("初始化成功");
rc = MyMondem.SendMsg( -1, tophone, msg); //发送一条信息
if (rc == 0)
{
System.out.println("提交成功, rc=" + rc);
return true;
}
}
return false;
}
public static void main(String tophone,String msg)
{
mondem Mytest =new mondem(); //创建一个 mondem 对象, 这个对象最大可以支持64个端口发送
int rc; rc=Mytest.SetThreadMode(1); //开启线程模式
if(rc==0){
System.out.println("设置线程模式成功");
} else {
System.out.println("设置线程模式失败");
return;
}
if((rc=(Mytest.InitModem(-1)))==0)//初始化短信猫
{
System.out.println("初始化成功");
rc=Mytest.SendMsg(-1,tophone,msg); //发送一条信息
if(rc==0){
System.out.println("提交成功, rc="+rc); while(true) //循环等待发送成功,并显示接收信息, Ctrl-C 退出循环
{
String [] s = Mytest.ReadMsgEx(-1);
if(s[0]=="-1") {
System.out.println("-无信息-----");
} else {
System.out.println(s[0]);
System.out.println(s[1]);
System.out.println(s[2]);
}
System.out.println("...."+ //显示各个端口的状态
Mytest.GetStatus(0)+
Mytest.GetStatus(1)+
Mytest.GetStatus(2)+
Mytest.GetStatus(3)+
Mytest.GetStatus(4)+
Mytest.GetStatus(5)+
Mytest.GetStatus(6)+
Mytest.GetStatus(7)+
"...."
);
try{Thread.sleep(5000);}catch(InterruptedException e){} //延时等待
}
} else {
System.out.println("提交错误, rc="+rc);
}
} else {
System.out.println("初始化错误!"+rc);
}
}
}
当我在jsp中调用
MsgServer MobileMsg=new MsgServer();
MobileMsg.Instance();
的时候,MyMondem = new mondem();部分倒是可以通过,并且loadLibrary也没出现异常,就是当继续往下走,到rc = MyMondem.SetThreadMode(1)时,就卡着不动了。
另外,我参考另外一篇帖子,把MonDem.dll设置到了lib\native路径下了,不知道为什么还不行?不能调用DLL中的函数?
解决方案 »
- 求助ObjectInputStream用法
- 一个操作系统下能启动多个JVM吗?
- java中二叉树删除节点问题(假设只删除一个)
- javabean中父类怎么获取子类的属性(只能用jdk API来实现)
- sun.net.ftp.ftpClient中如何删除ftp服务端的文件?
- 请教个在SERVLET中调用 getRuntime().exec(command) 的问题
- FixedField????????????
- 为什么线程的名称打印不出来?
- 老大救命!!!!!!
- 谁能告诉我sql语言中的update怎么用呀?
- 十万火急!命令行可以,工程中调用DLL出错
- java3d——如何实现把鼠标所在点的坐标转化为3d坐标
这个帖子中webfax() 对问题的回答:
注:如果不是在当前工程的根目录下,则javah需要加路径,如:
例:TestDll 的Package为:com
首先在C:\j2sdk1.4.0-rc\bin>下新建目录:com
并拷贝TestDll.class到C:\j2sdk1.4.0-rc\bin\com
其次在CMD下,执行
C:\j2sdk1.4.0-rc\bin>javah com.TestDll,
在C:\j2sdk1.4.0-rc\bin下生成com_TestDll.h(结构为package_classname)
最后com_TestDll.h加入到DLL中去,生成新的DLL
我的解决的办法就是从这里得到灵感的:)另外贴一篇关于JNI的文章,写得不错:
http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html呵呵,谢谢上边回帖的兄弟们!!
生成头文件后, mondem.cpp 怎么写才能实现各种方法
然后在JBUILDER里面怎么用呢?谢谢!