tomcat在Linux环境下调用so文件执行native方法的问题

乐邦666 2013-07-11 06:40:50

<servlet>
<servlet-name>smcInitServlet</servlet-name>
<servlet-class>com.xxx.common.util.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>



public class InitServlet extends HttpServlet
{
/**
* 日志对象
*/
private Log logger = LogFactory.getLog(InitServlet.class);

/**
* 初始化项目所需
* {@inheritDoc}
*/
public void init(ServletConfig servletConfig)
throws ServletException
{
logger.error(".....new License therad...");
new Thread(new License()).start();

}
}




public class License implements Runnable
{
/**
* 注释内容
*/
private static final long serialVersionUID = 1L;

/**
* 日志对象
*/
private static Log logger = LogFactory.getLog(License.class);

static
{
int i = 0;
try
{
logger.error("loadLibary start...");
System.loadLibrary("License");
i = 1;
logger.error("load Libary OK...");
}
catch (Exception e)
{
i = 2;
// TODO Auto-generated catch block
logger.error("load error");
e.printStackTrace();

Runtime runtime = Runtime.getRuntime();
try
{
i = 3;
logger.error("load libLicense.so error, killall java");
runtime.exec("killall java");
}
catch (Exception e1)
{
i = 4;
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
finally
{
logger.error("i = " + i);
if (i == 0)
{
Runtime runtime = Runtime.getRuntime();
try
{
logger.error("load libLicense.so error, killall java");
runtime.exec("killall java");
}
catch (Exception e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}

private native boolean verifylicense();

@Override
public void run()
{
System.getProperty("java.library.path");
logger.error("java.library.path:" + System.getProperty("java.library.path"));
// TODO Auto-generated method stub
logger.error("into init() method..");
License l = new License();
Object o = l.verifylicense();
logger.error("return value is: " + o.toString());
if (!l.verifylicense())
{
logger.error("verifylicense ERROR");

Runtime runtime = Runtime.getRuntime();
try
{
logger.error("verifylicense failed, killall java");
runtime.exec("killall java");
}
catch (Exception e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
else
{
logger.error("verifylicense OK");
}
logger.error("after verifylicense~~~~");
}
}


每次tomcat启动时,verifylicense方法返回值都是false,不管我的License.dat文件是否存在。我在C里面加了日志输出,通过查看输出的日志文件,C写的verifylicense方法根本没有进入,也就是说.so库文件里面实现的方法没有被执行。

但是我把License.java改成一个包含main()方法的java文件,手动到相应的目录去编译、执行,却是能够成功执行并返回预计结果的

我通过 System.getProperty("java.library.path")打印出library的path:
java.library.path:
/opt/java/jdk1.6.0_33/jre/lib/amd64/server:
/opt/java/jdk1.6.0_33/jre/lib/amd64:
/opt/java/jdk1.6.0_33/jre/../lib/amd64:
/usr/java/packages/lib/amd64:
/usr/lib64:
/lib64:
/lib:
/usr/lib
so文件我放在/lib下面,在启动tomcat和执行License.class的时候没有报任何异常,也就是说库文件被正确加载了,只是在tomcat环境下本地方法没有执行,请问各位大大这是什么情况呢?是什么原因造成的,这个问题困扰了我几天了,希望各位大神指教一下,谢谢!
...全文
747 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zvaljean 2015-03-23
  • 打赏
  • 举报
回复
用的什么方法解决的??? 我的也遇到类似的情况!!!!
乐邦666 2013-07-16
  • 打赏
  • 举报
回复
算了,换一种方式解决了这个问题~~~
乐邦666 2013-07-13
  • 打赏
  • 举报
回复
翻页都木有啊~~~
乐邦666 2013-07-13
  • 打赏
  • 举报
回复
周末了都,有木有人回复下呀~~~
zcsyyyy 2013-07-13
  • 打赏
  • 举报
回复
飞的更高哈哈
oh_Maxy 版主 2013-07-12
  • 打赏
  • 举报
回复
引用 4 楼 zyy_jay 的回复:
[quote=引用 3 楼 oh_Maxy 的回复:] 手动写死路径可以,应该是get路径的问题了。 建议用相对路径,放工程目录下一起打包(如果对工程没影响的话)。
谢谢这么晚帮回答 放工程相对目录,具体是在哪? 难道不是java.library.path吗?[/quote] 就解压工程的工程名目录下 另外,你的main方法贴出来看看啊?看看怎么操作的
乐邦666 2013-07-12
  • 打赏
  • 举报
回复
求大神回复呀~~~~~
乐邦666 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 oh_Maxy 的回复:
手动写死路径可以,应该是get路径的问题了。 建议用相对路径,放工程目录下一起打包(如果对工程没影响的话)。
好像不是引入so文件路径的问题 是执行本地方法的问题呀!!!!
乐邦666 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 oh_Maxy 的回复:
手动写死路径可以,应该是get路径的问题了。 建议用相对路径,放工程目录下一起打包(如果对工程没影响的话)。
谢谢这么晚帮回答 放工程相对目录,具体是在哪? 难道不是java.library.path吗?
乐邦666 2013-07-12
  • 打赏
  • 举报
回复
应该不是路径的问题,加载so文件没有问题,就是native方法不执行~~~
乐邦666 2013-07-12
  • 打赏
  • 举报
回复



public class License
{
    /**
     * 注释内容
     */
    private static final long serialVersionUID = 1L;
    
    /**
    * 日志对象
    */
    //private static Log logger = LogFactory.getLog(License.class);
    
    static
    {
        int i = 0;
        try
        {
            logger.error("loadLibary start...");
            System.loadLibrary("License");
            i = 1;
            logger.error("load Libary OK...");
        }
        catch (Exception e)
        {
            i = 2;
            // TODO Auto-generated catch block
            logger.error("load error");
            e.printStackTrace();
            
            Runtime runtime = Runtime.getRuntime();
            try
            {
                i = 3;
                logger.error("load libLicense.so error, killall java");
                runtime.exec("killall java");
            }
            catch (Exception e1)
            {
                i = 4;
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        finally
        {
            logger.error("i = " + i);
            if (i == 0)
            {
                Runtime runtime = Runtime.getRuntime();
                try
                {
                    logger.error("load libLicense.so error, killall java");
                    runtime.exec("killall java");
                }
                catch (Exception e1)
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }
    }
    
    private native boolean verifylicense();
    
    public static void main(String[] args)
    {
        System.getProperty("java.library.path");
        logger.error("java.library.path:" + System.getProperty("java.library.path"));
        // TODO Auto-generated method stub
        logger.error("into init() method..");
        License l = new License();
        Object o = l.verifylicense();
        logger.error("return value is: " + o.toString());
        if (!l.verifylicense())
        {
            logger.error("verifylicense ERROR");
            
            Runtime runtime = Runtime.getRuntime();
            try
            {
                logger.error("verifylicense failed, killall java");
                runtime.exec("killall java");
            }
            catch (Exception e1)
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        else
        {
            logger.error("verifylicense OK");
        }
        logger.error("after verifylicense~~~~");
    }
}

oh_Maxy 版主 2013-07-11
  • 打赏
  • 举报
回复
手动写死路径可以,应该是get路径的问题了。 建议用相对路径,放工程目录下一起打包(如果对工程没影响的话)。
乐邦666 2013-07-11
  • 打赏
  • 举报
回复
这会儿大家都在路上么~~~咋没人回复啊
乐邦666 2013-07-11
  • 打赏
  • 举报
回复
本人第一次发贴,希望得到解答

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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