- 论坛徽章:
- 0
|
我的java程序中加载了一个c写的so库,然后java作为api接口供php调用,现在遇到了一个问题,就是php调用java时,java会去连so库,然后第一次页面显示正常,再刷新就出现问题了,错误提示如下:
Fatal error: Uncaught [o(Exception):"java.lang.Exception: CreateInstance failed: new StreamFountJava.SFountAPI. Cause: java.lang.UnsatisfiedLinkError: Native Library /usr/lib/libsfount_api.so already loaded in another classloader"] thrown in /home/mbos/php_java.php on line 10
再刷新出现:
Fatal error: Uncaught [o(Exception):"java.lang.Exception: CreateInstance failed: new StreamFountJava.SFountAPI. Cause: java.lang.ClassNotFoundException: Unresolved external reference: java.lang.NoClassDefFoundError. -- Unable to call constructor because it or one of its parameters refer to the mentioned external class which is not available in the current "java_require()" url path. Remember that all interconnected classes must be loaded with a single java_require() call, i.e. use java_require("foo.jar;bar.jar") instead of java_require("foo.jar"); java_require("bar.jar"). Please check the Java Bridge log file for details."] thrown in /home/mbos/php_java.php on line 10
StreamFountJava.SFountAPI是我做的一个package,已将其打成.jar给php调用了,libsfount_api.so 是我的so库
第一次是显示正常的!
再次刷新产生的错误是由于第一个错误引起的,因为第一个错误提示说我的so库已经存在于其他的classloader中了,所以导致第二次刷新的时候出错,天呢,调用so库的不是同一个.jar里的class嘛
我的想法:能不能在java运行完释放掉so库?能释放吗?
顺便提一下无关的问题,我在VMware里的linux下执行刷新页面不会出错,只有重新将我的SFountAPi.class连同目录打包成.jar后才会出现上述问题,可是在纯正的linux环境下直接刷新就会出现这个问题,这是为什么?
PS:重启apache就能再正确显示一次
我用的是apache2+php5+php-java-bridge来完成php调用java的。 |
|