JNative在Linux下应用的若干问题

  在一项目中,使用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文件。
 

你可能感兴趣的:(c,应用服务器,linux,jni,gcc)