Java jni 加载 so 时,出现 undefined symbol 错误

原创 2016年05月31日 17:16:47
1 数据加解密使用了 gmp 大数库,Java 程序通过 Jni 来调用C++接口。

问题描述:

在CentOS环境中,一切正常,Java 程序能正常加载编译后的 so 文件。现在需要将系统建议到麒麟系统上,同样编译出来 .so文件,结果java 程序加载 so 并执行native接口时,报 undefined symbol 错误(注意,找不到的符号是 so 文件依赖的另外的动态库中的函数)。

1 C++验证程序;

首先进行了 c++ 程序验证,写了一个验证程序,通过 lopen 动态加载so文件,程序正常运行。说明能够正确识别所有的函数符号。也说明,库文件本身是没有问题的。

2 ldd 查看

ldd xxx.so发现,依赖库的列表中恰巧缺少了那个包含未定义符号的动态库。推测,很有可能是因为,Java加载动态库时,会根据这些依赖信息进行加载,而c程序的加载机制可能有所不同。

3 ldconfig 

还发现,当执行 ldconfig 时,会报错: libgmp.so.3 不是符号链接!

因为在重新编译生成 libgmp.so.3 时,lib文件并没有放在 /usr/lib 下,然后通过手动拷贝所有 lib 下的文件到 /usr/lib 中。在拷贝的过程中,本来的软连接全部替换成了被链接的文件。

最后,抱着试一试的心态,重新在/usr/lib 下创建相应的软连接,再重新编译生成 so 文件,ldd 查看依赖库时,竟然能正确的显示出依赖 libgmp.so 的信息了。

然后在调用 java 程序,运行正常。

-----------------------------------------
总结:对 so 的版本知识,不够了解,如下:

<以下引用网络资料>
简单可以这样理解,你编译出一个libabc.so,这个东西要这样声明:libabc.so.<major>.<minor>,比如说,你可以有libabc.so.3.2,这是3.2版本的,你还可以再装一个lib.so.4.1的,然后创建一个符号链接libabc.3指向前者,libabc.4指向后者,你的应用程序用3就会用到3,指向4,就会用到前者。

所以,总的来说叫libSM.so.6的,应该是个符号链接,具体是什么版本,你的看你的软件包信息,看你怎么把这个文件装进去的。比如可以考虑用dpkg -S来查一下,有时有些脚本没有写好,链接就会变成文件,你重装(这个包)或者手工修复都可以。

版权声明:本文为博主原创文章,未经博主允许不得转载。

“undefined JNI_GetCreatedJavaVM”和“File format not recognized”错误原因分析

如果编译时,报如下所示错误: ../../third-party/hadoop/lib/libhdfs.a(jni_helper.c.o): In function `getGlobalJNIEnv...
  • Aquester
  • Aquester
  • 2015年11月13日 17:11
  • 1653

linux动态库so调用外部so,运行时出现undefined symbol

linux动态库so调用外部so,运行时出现undefined symbol
  • shatterheart
  • shatterheart
  • 2016年09月05日 14:46
  • 6435

LINUX 下 JNA 调用 so--正确版

项目中需要用到JAVA调用c++,了解过JNI,但比较复杂,后来看到JNA(JNI的加强版)。 网上看了很多例子,但是始终出错,主要错误原因是undefined symbol,找不到c++ 方法。 ...
  • u013242491
  • u013242491
  • 2014年03月16日 10:14
  • 2585

android通过Jni加载so库遇到UnsatisfiedLinkError问题!!!

终于解决了困扰我半个世纪的难题,记录下: 我的项目中使用了别人的so类,已经打包好了,且只有armeabi这一种。按说应该是兼容性最好的了,但是问题偏偏出现了!!! 一旦加载so时就会报错...
  • yxm1064
  • yxm1064
  • 2016年08月05日 13:04
  • 1065

Androidstudio .so文件引用错误--java.lang.UnsatisfiedLinkErrorXXXXX

Androidstudio .so文件引用错误--java.lang.UnsatisfiedLinkErrorXXXXX
  • u010870167
  • u010870167
  • 2016年07月19日 22:50
  • 5939

GCC/LD编译链接潜规则 (第五弹) : 为什么会有undified symbol?

GCC/LD编译链接潜规则 (第五弹) : 为什么会有undified symbol? nemozhang 2012-07-17 15:11 04d0ugKnyvJt...
  • zdl1016
  • zdl1016
  • 2013年06月03日 17:41
  • 19148

android使用CMake进行jni编写遇到的一些问题

前言          android studio 2.2之后出的CMake 让jni的编写方便了很多,使用CMake让我们不在烦恼函数的定义,以前我们需要通过javah命令生成,jni规定的函数名...
  • qqchenjian318
  • qqchenjian318
  • 2017年05月27日 13:59
  • 1016

vxworks编译时常见的问题分析

在自己的应用程序编译的时候,经常会出现这样一个警告Warning: nonewline at end of file 这是什么原因呢?在网上看到解释是 EDK 7.1 includes the G...
  • baiyang20140704
  • baiyang20140704
  • 2014年10月16日 10:48
  • 1059

NDK编译FFMPEG所遇问题的解决方法(一)

最近要将FFMPEG v2.1.1移植到我的安卓程序当中去。在NDK变异的过程中遇到了以下的问题: $ $NDK/ndk-build NDK_PROJECT_PATH=$NDK/samples...
  • u014510919
  • u014510919
  • 2014年04月02日 23:12
  • 1740

问题总结2013W07 —— Android 编译OpenCV Demo遇到的问题

1. OpenCV下载与编译     Ref         Using OpenCV with Eclipse (plugin CDT)     Step         软件安装   ...
  • yanx730
  • yanx730
  • 2013年02月20日 10:54
  • 10971
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java jni 加载 so 时,出现 undefined symbol 错误
举报原因:
原因补充:

(最多只允许输入30个字)