热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Androidso库中UnsatisfiedLinkError

最近游戏联运商反馈了一个so库中方法找不到,该问题比较常见,记录下排查过程:报错日志:Tombstonemaker:xC

最近游戏联运商反馈了一个so库中方法找不到,该问题比较常见,记录下排查过程:

报错日志:

Tombstone maker: 'xCrash 3.0.0'
Crash type: 'java'
Start time: '2022-09-06T13:05:49.347+0800'
Crash time: '2022-09-06T13:05:58.850+0800'
App ID: 'com.xxx.meta'
App version: '3.34.0.2'
Rooted: 'No'
API level: '29'
OS version: '10'
ABI list: 'armeabi-v7a,armeabi' //该手机cpu支持abi
Manufacturer: 'HUAWEI'
Brand: 'HUAWEI'
Model: 'MAR-TL00'
Build fingerprint: 'HUAWEI/MAR-TL00/HWMAR:10/HUAWEIMAR-TL00/10.0.0.161C01:user/release-keys'
pid: 16152, tid: 17111, name: GLThread 4240 >>> com.xxxxx.meta <<< //报错线程和进程名
java stacktrace: //详细报错信息
java.lang.UnsatisfiedLinkError: No implementation found for void org.appplay.lib.AppPlayNatives.nativeOnIdle() (tried Java_org_appplay_lib_AppPlayNatives_nativeOnIdle and Java_org_appplay_lib_AppPlayNatives_nativeOnIdle__)at org.appplay.lib.AppPlayNatives.nativeOnIdle(Native Method)at org.appplay.lib.AppPlayRenderer.onDrawFrame(AppPlayRenderer.java:71)at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1592)at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1281)

1.检查c&#43;&#43;代码中是否有该函数&#xff1a;

void JNICALL Java_org_appplay_lib_AppPlayNatives_nativeOnIdle(JNIEnv *env, jclass){if(s_App)s_App->onIdle();}

因此,排除了c&#43;&#43;层代码没实现可能性。


2.检查so库中是否有该函数信息&#xff1a;

根据so对应的cpu类型,选择对应ndk中objump 工具。这里&#xff0c;报错设备是areambi 选择arm-linux-androideabi-4.9

其次使用其-d 命令 查看未strip 的so库中方法信息&#xff0c;中执行以下语句&#xff0c;

xxxx\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-objdump.exe -d xxxx\libAppPlayJNI.so>stacktrace.txt

执行完后,会生成带有函数信息的stacktrace.txt &#xff0c;如下图所示:
在这里插入图片描述

在其中,检索nativeOnIdle关键字&#xff0c;找到有关信息。

00cc6494 <Java_org_appplay_lib_AppPlayNatives_nativeOnIdle>:cc6494: e59f0014 ldr r0, [pc, #20] ; cc64b0 <Java_org_appplay_lib_AppPlayNatives_nativeOnIdle&#43;0x1c>cc6498: e79f0000 ldr r0, [pc, r0]cc649c: e3500000 cmp r0, #0cc64a0: 012fff1e bxeq lrcc64a4: e5901000 ldr r1, [r0]cc64a8: e5911028 ldr r1, [r1, #40] ; 0x28cc64ac: e12fff11 bx r1cc64b0: 03057e60 .word 0x03057e60

因此,排除了没有将代码打包进去so库可能性。


3.检查是否加载对应cpu的so库问题&#xff1a;


3.1 缺少cpu 即abi支持so库&#xff1a;

根据捕捉到日志&#xff0c;可知当该设备支持armeabi-v7a,armeabi

查看下渠道包apk, 已经带有armeabi-v7a 的支持&#xff0c;因此排除了该问题。

若是调试过程遇到该问题&#xff0c;则可以通过执行&#xff1a;
adb shellcat /proc/cpuinfo 查看下支持abi,如下图所示&#xff1a;
在这里插入图片描述


3.2 调用相应方法前没有加载so库&#xff1a;

检查调用nativeOnIdle() 是在GLThread 异步线程中&#xff0c;但加载so库的过程是主线程中。其次,调用前并没有检查是否so库加载好的逻辑&#xff0c;是该原因导致。

解决方式&#xff1a; 调用前&#xff0c;检查so库是否已经load状态。


推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
壹路上有祢_522
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有