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来查一下,有时有些脚本没有写好,链接就会变成文件,你重装(这个包)或者手工修复都可以。

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

相关文章推荐

Linux下引用类库报undefined symbol错误的解决方法

笔者在SLES11SP1启动snmpd服务时报如下的错误,因为之前都是没有问题的,觉得非常奇怪。 /usr/sbin/snmpd: undefined symbol: smux_listen_sd 在...

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

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

JNI编程-- undefined reference to `__android_log_print' 的解决办法

按如下步骤操作: 1、在android.mk 文件中找到 include $(CLEAR_VARS)  这一行, 在下面增加一行: LOCAL_LDLIBS    := -lm -llo...

ndk-build时各种诡异的undefined reference--

ndk-build时各种诡异的undefined reference解决方法 在编译自己编码的AndroidRTSP播放器网络库时,网络库引用到了Android NDK编译出的live555子模...

LINUX 下 JNA 调用 so--正确版

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

java调用so动态链接库

用JNI实现 实例: 创建HelloWorld.java class HelloWorld { private native void print(); public staticvo...

JAVA实现RSA加密解密

RSA 工具类。提供加密,解密,生成密钥对等方法。  RSA加密原理概述   : RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数。 据猜测,从一个密钥...

Java生成RSA非对称型加密的公钥和私钥(利用java API)

非对称型加密非常适合多个客户端和服务器之间的秘密通讯,客户端使用同一个公钥将明文加密,而这个公钥不能逆向的解密,密文发送到服务器后有服务器端用私钥解密,这样就做到了明文的加密传送。 非对称型...

Linux下编译代码错误: undefined reference to symbol 'cos@@GLIBC_2.2.5' //lib/x86_64-linux-gnu/libm.so.6: err

首先给出错误截图: 给出我的makefile文件LIB:= -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_legacy -lst...
  • CV_YOU
  • CV_YOU
  • 2017年04月03日 11:20
  • 1055

解决Ubuntu WPS演示全屏闪退(swrast_dri.so: undefined symbol: _glapi_tls_Dispatch)的错误

1. 故障在Ubuntu14.014上使用WPS演示(WPP)时,一全屏播放就会闪退。经过分析,故障原因是libGL.so加载一个符号失败。swrast_dri.so: undefined symbo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java jni 加载 so 时,出现 undefined symbol 错误
举报原因:
原因补充:

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