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

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

相关文章推荐

java调用so动态链接库

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

windows上搭建龙芯1c开发环境

本文主要采用ming32-make和交叉编译工具链为实现龙芯1c裸机程序在windows上的编译

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

OpenVPN 实现跨网络远程桌面访问

1 场景需求: 本公司系统运行在客户现场的Windows server环境,负责采集数据,并进行数据分析工作,展示层在云端Linux服务器部署,之间通过OpenVPN建立连接。也就是访问数据...

龙芯麒麟编译安装Ruby问题处理

龙芯麒麟环境,编译 Ruby 链接失败首先,make -v 确认环境的 build type 为 mips64el-neokylin-linux-gnu> configure –build=mips6...

JNI开发-加载动态库错误之undefined symbol:

以下错误均是编译、链接正常,但是用System.load("XXX");加载libXXX.so库时会出现 1、Exception in thread "main" java.lang.Unsatis...

Java(JNI)代码访问本地代码C、C++

1、Java是跨平台的语言,但是在有些时候仍然是有需要调用本地代码(这些代码通常是由C/C++编写的)。 2、Sun公司提供的JNI是Java平台一个功能强大的接口。这个JNI接口提供了Java与操作...
  • Mr_Von
  • Mr_Von
  • 2008-09-04 10:27
  • 1865

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

1 数据加解密使用了 gmp 大数库,Java 程序通过 Jni 来调用C++接口。 问题描述: 在CentOS环境中,一切正常,Java 程序能正常加载编译后的 so 文件。现在...

qt添加so库时出现不可兼容错误

问题描述: 错误提示::-1: 错误:skipping incompatible /usr/local/lib/libzzm.so when searching for -lzzm .pro文...

NDK编译出现undefined reference to错误

本文转载自:http://blog.chinaunix.net/uid-20680966-id-4961553.html最近在使用android studio编译安卓程序,要用到jni 我在jni源...

symbian的加载dll出现错误

今天做有米的塞班广告出现问题。我的主程序分成多个dllRLibrary  libDll;libDll.Lookup(1)出现错误参考以下文章得到解决。Symbian DLL(Dynamic Link ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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