在一项目中,使用JNative替代JAVA的JNI来做跨语言调用,在LINUX环境下遇到若干问题。
首先是libJNativeCpp.so文件的版本问题,为调试问题,打开JNative的DEBUG日志开关,并指定libJNativeCpp.so的地址,不指定亦可,会到jar包加载该文件。
System.setProperty("jnative.debug", "true");
System.setProperty("jnative.loadNative","/usr/lib/libJNativeCpp.so");
调用函数时,遇到这样的问题:
JNative library not loaded, sorry !java.lang.IllegalStateException: JNative library not loaded, sorry !
打开JNative的DEBUG日志开关后,发现如下错误信息:
/usr/lib/libJNativeCpp.so: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by /usr/lib/libJNativeCpp.so)
查看源码,发现错误原因是由于System.load("/usr/lin/libJNativeCpp.so")失败,异常信息即为上面贴出信息。GLIBC_2.4是linux下的一个c运行库的版本号。
通过# ldd libJNativeCpp.so可以查看该文件的依赖关系。
在版本不一致的情况下通常显示如下:
[root@localhost lib]# ldd libJNativeCpp.so
./libJNativeCpp.so: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./libJNativeCpp.so)
linux-gate.so.1 => (0xffffe000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xf7ef5000)
libm.so.6 => /lib/tls/libm.so.6 (0xf7ed2000)
libc.so.6 => /lib/tls/libc.so.6 (0xf7da7000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf7d9f000)
/lib/ld-linux.so.2 (0x56555000)
到/lib下,查看系统当前glibc的版本信息:
[root@localhost lib]# cd /lib
lrwxrwxrwx 1 root root 13 2010-01-05 libc.so.6 -> libc-2.3.4.so
发现系统当前的glibc的版本是2.3.4,低于我们下载的应用包里的libJNativeCpp.so的编译环境.当其依赖的文件版本冲突时,低版本会导致不能成功调用该文件。
介绍下GLIBC。
glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
介绍了GLIBC,自然要介绍一下GCC。
gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。
如何解决问题,已经快浮现了。
在当前linux环境下,使用GCC编译器编译libJNativeCpp.so的源文件,生成依赖于当前环境下的libJNativeCpp.so文件。
华山一条路,来说说如何编译。
下载JNative-1.3.2-src.zip,解压后,在JNative-1.3.2-src\JNativeCpp 下可以找到编译libJNativeCpp.so的源文件。上传该JNativeCpp文件夹到你的Linux服务器,在JNativeCpp/Release目录下,编译我们需要的基于libc-2.3.4.so的libJNativeCpp.so文件。