ndk编译 错误:dlopen failed:cannot locate symbol "一个符号" referenced by "你的库.so/.a" lang.UnsatisfiedLinkErr
2015-07-30 15:22
344 查看
最近在某家公司做实习生,从事移植工作,公司要求将以前跑在linux老设备上的程序移植到android平台上。项目很大一部分是c++写的,所以需要用ndk把所有源代码编到android平台下,当然也包括所依赖的第三方库。第三方库还比较好说,因为boost,openssl,websocket这些库要么对android有很好的支持,要么有开源项目去辅助支持。所以主要工作还是编译源代码问题,代码量相当庞大。
因为在学校的时候很少做c++开发和编译工作,所以解决问题很困难,这几天就有一个很怪异的问题缠绕着我。
问题是这样的,由于保密措施,项目代码都是分离的,每个人都只有自己的一部分。所以我的同事需要用ndk编好他的代码和他依赖的第三方库,编程.a库,然后另一个同事再依赖前一个同事 的.a库和第三方库,这样一层一层..........最后我拿到这个模块的库再去编。
结果出问题了,在用jni去调这个库的时候:
cao,这是怎么回事?他说找不到这个符号,但打开.a文件,可以看到这个符号。于是就怀疑库是不是没引进来,问了下同事,同事说.a的库编译的时候其他库都会引进来。但看了看文件大小,模块的.a库只有7M,但那些第三方库却有几百M,很明显,没引进来。google了一下,是mk文件有问题。
最后一句include $(PREBUILT_STATIC_LIBRARY),预编译的模块不会出发构建过程。只是把预编译的共享库拷贝到$PROJECT/obj/local路径,静态库则是拷贝到$PROJECT/libs/并进行裁剪。
所以,如果我要编这个模块的话,要把每个同事所依赖的.a全部引进来。没错,全部。
测试通过,成功跑起。
因为在学校的时候很少做c++开发和编译工作,所以解决问题很困难,这几天就有一个很怪异的问题缠绕着我。
问题是这样的,由于保密措施,项目代码都是分离的,每个人都只有自己的一部分。所以我的同事需要用ndk编好他的代码和他依赖的第三方库,编程.a库,然后另一个同事再依赖前一个同事 的.a库和第三方库,这样一层一层..........最后我拿到这个模块的库再去编。
结果出问题了,在用jni去调这个库的时候:
cao,这是怎么回事?他说找不到这个符号,但打开.a文件,可以看到这个符号。于是就怀疑库是不是没引进来,问了下同事,同事说.a的库编译的时候其他库都会引进来。但看了看文件大小,模块的.a库只有7M,但那些第三方库却有几百M,很明显,没引进来。google了一下,是mk文件有问题。
最后一句include $(PREBUILT_STATIC_LIBRARY),预编译的模块不会出发构建过程。只是把预编译的共享库拷贝到$PROJECT/obj/local路径,静态库则是拷贝到$PROJECT/libs/并进行裁剪。
所以,如果我要编这个模块的话,要把每个同事所依赖的.a全部引进来。没错,全部。
测试通过,成功跑起。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories