web项目中dll文件问题

quanmie 2007-02-10 01:47:09
在web开发中遇到了用jni调用c++编译的dll 文件,现在有个问题是当把该dll文件放到tomcat目录下的bin文件夹下,或是jdk/bin文件夹下,程序才能正确访问,否则就会找不到该文件。
请问大家有没有好的方法,能把dll文件放到本地项目中就可以访问呢?比如说放到项目下的WEB-INF文件夹下,或是其它地方。
...全文
716 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
quanmie 2007-02-12
  • 打赏
  • 举报
回复
终于成功了,原来确实要load绝对路径,而且不可以使用system.loadlibrary方法,要使用system.load方法,后来看了,java的api,load方法是加载一个动态库文件,而loadlibrary是加载一个lib文件。而且之前没有加载正确,还有一个原因就是必须将加载代码放在static 块中,这也是为什么网上给的例子都是这么写的原因。只有程序执行之前,将dll文件加载到内存中,之后的程序才能找到,昨天我试的时候,忘了这一点,没有加static所以也没能找到,谢谢大家的帮助。
quanmie 2007-02-12
  • 打赏
  • 举报
回复


public class CheckImage {

public native static void check(String imagePath,int sensitivity);

static
{

System.loadLibrary("CheckImage");

}

public CheckImage()
{

}

}
这就是调用dll的代码,用绝对路径也不行,我试了。
quanmie 2007-02-12
  • 打赏
  • 举报
回复
只不过dll上传到服务器上后,无法正确执行,明明可以load以它,但一执行就出错。唉。。。
liaohaiying 2007-02-10
  • 打赏
  • 举报
回复
你把调用DLL的代码贴出来
这个不是TOMCAT启动时自动加载,而是系统在开机时就根据环境变量里设的,把环境变量里的目录都设为全局属性(这个我不知道怎么说,就是在CMD下能在任何一个目录下使用环境变量中定义的目录下的文件,如你没给JDK定义环境变量,那么只能在JDK目录下的BIN下才会运行JAVA命令,反之就可以在任何地方运行JAVA命令),就是把你调用这个文件时的目录给算掉了,如果没有在环境变量中定义,那么要调用就必须带上文件的全目录地址才行
你先把调用DLL的代码贴出来看看
wanzyqyy 2007-02-10
  • 打赏
  • 举报
回复
路过,帮顶!
quanmie 2007-02-10
  • 打赏
  • 举报
回复
to:liaohaiying(大菜)
  你没明白我的意思,我不是找不到路径,而是在web项目中使用jni调用dll,这个dll如果不放到tomcat/bin或jdk/bin下面的话,程序就找不到,程序不能正确执行,如果放到tomcat/bin或jdk/bin下面,tomcat启动时好像会自动加载,然后程序就执行正常了。
  加载dll的过程是由tomcat自动执行的,好像没办法往里面传路径。
  我现在在找一个方法改变这种情况,可以把dll文件放到项目下的WEB-INF目录下就可以让程序正确执行,目前试了很多办法,都不奏效。实在是郁闷。谢谢大家的回复。
liaohaiying 2007-02-10
  • 打赏
  • 举报
回复
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>JSP中如何处理虚拟目录</title>
</head>
<body>
<%
String path=request.getRealPath("");
out.println(path);
%>
取得虚拟目录对应的磁盘路径<br>
Web站点主目录的位置为<font color=#ff0000><%=request.getRealPath("/")%></font><br>
JSP网页所在的目录位置<font color=#ff0000><%=request.getRealPath("./")%></font><br>
JSP网页所在目录上一层目录的位置<font color=#ff0000><%=request.getRealPath("../")%></font><br>
</body>
</html>
得到磁盘路径后总归行了吧
quanmie 2007-02-10
  • 打赏
  • 举报
回复
试了半天,除了不好使还是不好使。
“meteorlg(lance) 的方法就是找WEB-INF目录,定位了WEB-INF了,就可以找到你的DLL文件的位置,这样应该就能调用了”

只一个rootPath就可以让系统自动识别路径了吗?系统怎么会自动去按rootPath所指的路径找文件?
liaohaiying 2007-02-10
  • 打赏
  • 举报
回复
看错,不是bin文件夹,是lib,
这样的话,就是环境变量的问题了,你把这个DLL文件放在WINDOWS下的SYSTEM32下也一定行的,
meteorlg(lance) 的方法就是找WEB-INF目录,定位了WEB-INF了,就可以找到你的DLL文件的位置,这样应该就能调用了
liaohaiying 2007-02-10
  • 打赏
  • 举报
回复
tomcat目录下的bin文件夹和项目WEB-INF下的bin文件夹按道理讲是一样的,没道理不行的
quanmie 2007-02-10
  • 打赏
  • 举报
回复
难道没人来看吗?
quanmie 2007-02-10
  • 打赏
  • 举报
回复
to:zzj9898(止住悲伤,继续前进...)
我将文件放在项目下每个目录都不行。
to:meteorlg(lance)
高手,能详细解释一下如何调用这个类吗?那个ServletContextEvent从哪得来?
然后得到这个路径了,怎样读取dll文件呢?我调用dll文件的类里面用的是System.loadLibrary("XXX");然后在别的类里实例化这个类就可以了,那个绝对路径应该用在什么地方?
meteorlg 2007-02-10
  • 打赏
  • 举报
回复
public class SystemLoader implements ServletContextListener {
private static String rootPath;

public void contextInitialized(ServletContextEvent sc) {
rootPath=sc.getServletContext().getRealPath("/");
}
}

然后在web.xml中写
<listener>
<listener-class>com.lance.vs.web.controller.SystemLoader</listener-class>
</listener>

这样就取得了根目录的绝对路径
然后你用rootPath+"WEB-INF\\xxx.dll
就可以读取你的dll文件了
zzj9898 2007-02-10
  • 打赏
  • 举报
回复
放在WEB-INF/lib或者WEB-INF/classes 下不知道行不行的?
也可以试下设置环境变量PATH=<路径>/<dll文件名字>.dll;

如果不行的话,就当是帮你顶了~~~呵

81,091

社区成员

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

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