大家给个提醒,谢谢了。同样的程序在main函数里执行和在servlet执行,结果是不一样的呢?
普通JAVA代码
public static void main(String[] args){
Comp comp = new Comp();
comp.lgm("a.bmp", "b.bmp");
}
Servlet代码
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Comp comp = new Comp();
comp.lgm("a.bmp", "b.bmp");
}catch (Exception e){
e.printStackTrace();
}
response.sendRedirect("/default.jsp");
}
被调函数Comp.lgm
public String lgm(String a,String b){
String strScore = "zheng dao.";
Comp hello = new Comp();
hello.open();
String file1 = a;
String file2 = b;
System.out.println("11111111111111111111111");
try{
int init = hello.initTHFaceID("/gfserver/lib/Work",1);
System.out.println("22222222222222222222222222");
int free = hello.freeTHFaceID(1);
}catch(Exception e){
System.out.print("Pserrorerrorerrorerror:"+e.toString());
e.printStackTrace();
}
System.out.println("333333333333333333333333333333");
hello.close();//当servlet的时候,这个close没有关闭成功。但是普通JAVA关闭成功
System.out.println("444444444444444444444444444444444");
return strScore;
}
JNIEXPORT void JNICALL Java_com_Compare_open(JNIEnv *env, jobject obj){
imglib = dlopen("libMidCompare.so", RTLD_LAZY);
if(imglib!=NULL){
printf("Open libMidCompare.so with handle ok.\n");
}else{
printf("Open libMidCompare.so with handle fail!\n");
}
}
JNIEXPORT void JNICALL Java_com_Compare_close(JNIEnv *env, jobject obj){
if (imglib != NULL ) {
printf("close--2 ! \n");
dlclose(imglib);
printf("close--3 ! \n");///通过SERVLETR这个没有执行到,但是普通JAVA可以执行到
printf("Close with handle ok.\n");
}else{
printf("Close with handle fail!\n");
}
}
第三方厂商提供我们一个SO文件,里面有初始化资源函数,释放初始化资源函数,还有其他涉及业务的函数。。
通过编写一个普通JAVA main程序可以调用成功。首先OPEN SO动态链接库,然后打出1111,然后又初始化资源,然后打印2222,然后打出3333,然后释放资源,然后CLOSE so资源,最后打出4444这样的顺序。
但是我将同样的程序写在java servlet web工程下,为什么就执行就不对。
1.首先顺序不对,先打出111没有错,然后分别打出22222,3333,然后才OPENT SO动态链接,然后初始化资源,然后释放资源,然后CLOSE SO资源(此时关闭错误),并且4444没有打印出来。
难道是第三方提供的动态链接库不支持B/S结构的,或者是他们的SO中函数有另外的线程与JAVA SERVLET 线程不同步。
仅仅开了一个SERVLE,就是说我是通过但线程执行的啊。
------解决方案--------------------
看着挺复杂的样子。。
------解决方案--------------------
顺序应该是不会颠倒的,可能是输出的时候受到了什么影响
可以debug试试
------解决方案--------------------
是否达到了最终的功能?
debug下是否有异常,应该很好判断。
------解决方案--------------------
这个可能和web容器自己的线程有关系。
你先试下异步操作有没有问题private ExecutorService es;
@Override
public void init() throws ServletException {