linux libnotify.so.4,Jnotify在linux下的使用出现的问题解决

Jnotify程序代码:

import net.contentobjects.jnotify.JNotify;

import net.contentobjects.jnotify.JNotifyListener;

public class JnotifyForLinux {

public static void main(String[] args)

{

String monitedPath = "/tmp";

int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;

System.out.println("------Start Watching DIR: /tmp");

boolean watchSubtree = true;

try{

int watchID = JNotify.addWatch(monitedPath,mask,watchSubtree,new Listener());

Thread.sleep(1000000);

System.out.println("Timeout:Stop Watching!");

boolean res = JNotify.removeWatch(watchID);

if(!res)

{

System.out.println("Release Watching Error!");

}

}catch(Exception e){

e.printStackTrace();

}

}

public static class Listener implements JNotifyListener

{

public void fileRenamed(int wd,String rootPath,String oldName,String newName)

{

print("rename"+rootPath+":"+oldName+"--->"+newName);

}

public void fileModified(int wd,String rootPath,String name)

{

if(!name.endsWith("swp") && !name.endsWith("swp/") && !name.endsWith("swpx") && !name.endsWith("swpx/")){

print("[modified]"+rootPath+":"+name);

}

}

public void fileDeleted(int wd,String rootPath,String name)

{

if(!name.endsWith("swp") && !name.endsWith("swp/") && !name.endsWith("swpx")&& !name.endsWith("swpx/")){

print("[deleted]"+rootPath+":"+name);

}

}

public void fileCreated(int wd,String rootPath,String name)

{

if(!name.endsWith("swp") && !name.endsWith("swp/") && !name.endsWith("swpx")&& !name.endsWith("swpx/")){

print("[created]"+rootPath+":"+name);

}

}

void print(String msg)

{

System.err.println(msg);

}

}

}

在linux运行以上代码:

(1)编译时找不到jnotify-0.94.jar中的类,可以设置classpath路径,也可以使用下面的命令行参数,进行编译: javac -cp .:jnotify-0.94.jar JnotifyForLinux.java -cp 后面不要忘加当前目录. (2)运行时,执行下面的命令: java -cp .:jnotify-0.94.jar JnotifyForLinux

出现错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jnotify in java.library.path 这是因为程序运行时在动态链接库的搜索路径中找不到libjnotify.so(前面的lib是前缀,后面的.so是后缀)

把libjnotify.so放入java.library.path中,查看java.library.path用如下代码:

public class javalibpath {

public static void main(String[] args){

System.out.println(System.getProperty("java.library.path"));

}

}

这个变量可能会有多个位置,随便将jnotify压缩包中附带的libjnotify.so文件加入到其中的任何一个路径中即可。

接着运行又出现问题:

java.lang.UnsatisfiedLinkError:/usr/bin/libjnotify.so:/usr/bin/libjnotify.so: wrong ELF class: ELFCLASS64 (Possible cause: architecture word width mismatch)

原因是引入的libjnotify.so是64位系统的,而本身工程布置的linux为32位机,libjnotify.so与linux内核不符,换成32位的。

再接着又出现问题:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/bin/libjnotify.so: /lib64/libc.so.6: version `GLIBC_2.12' not found

这个问题在于系统的glibc库版本不是libjnotify.so编译时使用的版本,使用 rpm -qi glibc 查看系统的glibc库版本信息,在这里看到我的版本号是2.5,低于libjnotify.so编译时使用的版本2.12。

根据网友说明两种方法:

(1)重新编译libjnotify.so

我的处理方法是在本机重新编译libjnotify.so,如下: ·首先将源代码中的以下三个文件拷贝到某一目录下 net_contentobjects_jnotify_linux_JNotify_linux.c

inotify-syscalls.h

net_contentobjects_jnotify_linux_JNotify_linux.h ·然后进行编译,如下 -bash-3.1$ gcc -I /usr/java/jdk1.6.0_45/include/ -I /usr/java/jdk1.6.0_45/include/linux/ -fPIC -g -c net_contentobjects_jnotify_linux_JNotify_linux.c -o libjnotify.o -bash-3.1$ gcc -g -shared -W1 -o libjnotify.so libjnotify.o -lc -bash-3.1$ ls inotify-syscalls.h  libjnotify.so                                     net_contentobjects_jnotify_linux_JNotify_linux.h libjnotify.o        net_contentobjects_jnotify_linux_JNotify_linux.c 这里要引入 jni 需要的库,而且版本要和操作系统相匹配。使用 uname -a 查看操作系统的版本,java -version 查看JDK版本。我这里操作系统和JDK都是64位版本。 此时可以正常使用libjnotify.so了。 正确的执行过程如下:

-bash-3.1$ ls

jnotify-0.94.jar  JNotifyTest.java  libjnotify.so

-bash-3.1$ javac -cp .:jnotify-0.94.jar JNotifyTest.java

-bash-3.1$ java -cp .:jnotify-0.94.jar JNotifyTest

-bash-3.1$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

-bash-3.1$ java -cp .:jnotify-0.94.jar JNotifyTest

Monitoring /usr/local/study/jnotify3 (2)更换libjnotify.so版本,我使用了0.93包里面的libjnotify.so测试通过。

参考:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值