Android Jni调用so库,加载库失败分析

现有一个项目,通过JNI接口调用底层库,例如:lib***.so

如下所示,总是加载不成功。调试发现,每次加载so库,会跳到catch异常处理部分,然后打印异常log信息。

static{
	try{
		System.load("/data/data/com.***/lib/lib***.so");
	}
	catch(UnsatisfiedLinkError ulink){
		Log.i("HVnative====","Can not load library");
		ulink.printStackTrace();
	}
}

用arm-none-linux-gnueabi-ld工具发现有些函数未定义,如下所示:

snowdream@snowdream:~/workspace/$ arm-none-linux-gnueabi-ld lib***.so
arm-none-linux-gnueabi-ld: warning: libc.so, needed by lib***.so, not found (try using -rpath or -rpath-link)
arm-none-linux-gnueabi-ld: warning: libdvm.so, needed by lib***.so, not found (try using -rpath or -rpath-link)
lib***.so: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
arm-none-linux-gnueabi-ld: warning: cannot find entry symbol _start; defaulting to 00008248
lib***.so: undefined reference to `__aeabi_fadd'
lib***.so: undefined reference to `__aeabi_fdiv'
lib***.so: undefined reference to `__aeabi_fcmpge'
lib***.so: undefined reference to `__aeabi_dcmpgt'
lib***.so: undefined reference to `__aeabi_dcmpeq'
lib***.so: undefined reference to `__aeabi_uidiv'
lib***.so: undefined reference to `__aeabi_ui2d'
lib***.so: undefined reference to `__aeabi_dcmple'
lib***.so: undefined reference to `__aeabi_fcmplt'
lib***.so: undefined reference to `__aeabi_i2d'
lib***.so: undefined reference to `__aeabi_uidivmod'
lib***.so: undefined reference to `__aeabi_fmul'
lib***.so: undefined reference to `__aeabi_d2uiz'
lib***.so: undefined reference to `__aeabi_fcmpeq'
lib***.so: undefined reference to `__aeabi_d2iz'
lib***.so: undefined reference to `__aeabi_dcmpge'
lib***.so: undefined reference to `__aeabi_ldivmod'
lib***.so: undefined reference to `__aeabi_d2f'
lib***.so: undefined reference to `__aeabi_dmul'
lib***.so: undefined reference to `__aeabi_dcmplt'
lib***.so: undefined reference to `__aeabi_f2d'
lib***.so: undefined reference to `__aeabi_fcmple'
lib***.so: undefined reference to `__aeabi_idivmod'
lib***.so: undefined reference to `__aeabi_fsub'
lib***.so: undefined reference to `__aeabi_ddiv'
lib***.so: undefined reference to `__aeabi_ui2f'
lib***.so: undefined reference to `__aeabi_i2f'
lib***.so: undefined reference to `__aeabi_idiv'
lib***.so: undefined reference to `__aeabi_dadd'
lib***.so: undefined reference to `__aeabi_fcmpgt'
lib***.so: undefined reference to `__aeabi_dsub'
lib***.so: undefined reference to `__aeabi_f2iz'

如果“undefined reference to” 后面打印的函数是:
1、你自己写的函数,那么你应该去检查自己所写的这段代码有何问题,修改之后,再重新编译底层库;

2、系统函数,暂时还没找到合适的解决办法,正在努力寻求方法。

时间: 2024-09-20 00:25:12

Android Jni调用so库,加载库失败分析的相关文章

android eclipse-关于eclipce启动加载SDK失败的问题

问题描述 关于eclipce启动加载SDK失败的问题 如图,刚刚启动的eclipce,系统显示找不到d盘devices的声明,我的SDK是放在D盘的根目录的android_sdk_window目录下的,请各位大神们帮忙解决下呗 解决方案 为何不下载adt bundle? adt google已经不用了, 早就改成Android Studio 路径尽量不要带中文哈

android应用System.loadLibrary卸载加载得库实例

android 加载库后,如果重复加载同一个库,会出现已经加载得警告,也就是说,就不会重新加载so文件.这时候需要kill掉对应得activity,然后重新启动activity就可以使得so重新加载,对应代码: int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); Android Jni 用动态库的加载与卸载函数说明 一.当 Android 的 Virtual Machine 执行到 System.l

Android图片加载库Fresco

在Android设备上面,快速高效的显示图片是极为重要的.过去的几年里,我们在如何高效的存储图像这方面遇到了很多问题.图片太大,但是手机的内存却很小.每一个像素的R.G.B和alpha通道总共要占用4byte的空间.如果手机的屏幕是480*800,那么一张屏幕大小的图片就要占用1.5M的内存.手机的内存通常很小,特别是Android设备还要给各个应用分配内存.在某些设备上,分给Facebook App的内存仅仅有16MB.一张图片就要占据其内存的十分之一. 当你的App内存溢出会发生什么呢?它当

fackbook的Fresco (FaceBook推出的Android图片加载库-Fresco)

[Android开发经验]FaceBook推出的Android图片加载库-Fresco   欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件架构设计.测试等文章 原文链接:Introducing Fresco: A new image library for Android 译者 : ZhaoKaiQiang 校对者: Chaossss 校对者: bboyfeiyu 校对者: BillionWang  校对者: dujinyang 校对

Android常用的图片加载库

前言:图片加载涉及到图片的缓存.图片的处理.图片的显示等.四种常用的图片加载框架,分别是Fresco.ImageLoader. Picasso. Glide. Universal Image Loader:ImageLoader是比较老的框架,一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛. ImageLoader开源库存哪些特征: 1.多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 2.支持随意的配置ImageLoader,例如线

android图片加载库Glide

什么是Glide? Glide是一个加载图片的库,作者是bumptech,它是在泰国举行的google 开发者论坛上google为我们介绍的,这个库被广泛的运用在google的开源项目中. Glide解决什么问题? Glide是一个非常成熟的图片加载库,他可以从多个源加载图片,如:网路,本地,Uri等,更重要的是他内部封装了非常好的缓存机制并且在处理图片的时候能保持一个低的内存消耗. Glide怎么使用? 在Glide的使用方面,它和Picasso的使用方法是比较相似的,并且他们的运行机制也有很

怎么在 python程序编辑中自动加载库中函数或类中的成员??

问题描述 怎么在 python程序编辑中自动加载库中函数或类中的成员?? 在使用import引用系统模块时 如import(sys)中的函数 如:print(sys.path) 调用path函数 在写程序时想写sys . 后自动出现sys中所有的 成员 就像C#或java 中编辑代码一样 我用的是editPlus 编辑器 是不是要安装插件之类的 解决方案 不如直接用python tools for visual studio 解决方案二: 可以试试pycharm编辑器.功能比较强大,目前最好的编

LoadJS —— 微型的 JavaScript 异步加载库

LoadJS 是一个微型的异步加载库,支持流行的浏览器,体积非常小,只有 590 字节. 示例代码: // define a dependency bundle loadjs(['foo.js', 'bar.js'], 'foobar'); // execute code elsewhere when the bundle has loaded loadjs.ready('foobar', function() { // foo.js & bar.js loaded }); 支持的浏览器: IE

linux系统 动态共享库-动态共享库加载到内存中,怎样才能保证只有一份副本

问题描述 动态共享库加载到内存中,怎样才能保证只有一份副本 这几天一直在看关于动态共享库的知识,但看到一个地方,就不懂了,在网上搜索了一下!也没有找到答案!希望有哪位高手,帮小弟解答一下,小弟不胜感激! 问题:动态共享库,顾名思义,可以在多个进程间,进行共享!在系统中只保存一份副本,现在假设Process A已经将Lib A Load到物理内存,但当同样共享Lib A的Process B开始运行时,它是如何知道Lib A已经被加载到内存中,且如何找到这块物理内存?

flash as3 中动态加载库类失败解决方法

flash as3 中动态加载库类失败解决方法 这是错误的写法 for (var i:number=1; i<4; i++) { var mc1:mc1 = new mc1(); addchild(mc1); } as3里怎么循环加载库里的mc1 mc2 mc3类 就是下面意思是怎样个的写法 for (var i:number=1; i<4; i++) { var "mc"+i:"mc"+i = new "mc"+i(); addch