解决JNI调用在Android5.0+闪退问题
来源:互联网 发布:网络市场具体有哪些 编辑:程序博客网 时间:2024/04/29 13:17
日志信息如下:
08-14 15:48:41.127: A/art(5526): art/runtime/check_jni.cc:70] JNI DETECTED ERROR IN APPLICATION: illegal class name ‘xxx.xxx.xxx’
08-14 15:48:41.127: A/art(5526): art/runtime/check_jni.cc:70] (should be of the form ‘package/Class’, [Lpackage/Class;’ or ‘[[B’)
08-14 15:48:41.127: A/art(5526): art/runtime/check_jni.cc:70] in call to FindClass
check_jni.cc源码地址:https://android.googlesource.com/platform/art/+/kitkat-dev/runtime/check_jni.cc
看日志是在调用FindClass时出错了。在FindClass的时候会调用CheckClassName方法检查类名是否合法。CheckClasName方法源码如下:
// Checks that 'class_name' is a valid "fully-qualified" JNI class name, like "java/lang/Thread" // or "[Ljava/lang/Object;". A ClassLoader can actually normalize class names a couple of // times, so using "java.lang.Thread" instead of "java/lang/Thread" might work in some // circumstances, but this is incorrect. void CheckClassName(const char* class_name) { if (!IsValidJniClassName(class_name)) { JniAbortF(function_name_, "illegal class name '%s'\n" " (should be of the form 'package/Class', [Lpackage/Class;' or '[[B')", class_name); } }
在CheckClassName方法中调用了IsValidJniClassName方法,通过google搜索”IsValidJniClassName site:android.googlesource.com”,发现IsValidJniClassName方法的声明在utils.h中,实现在utils.cc中。
下面是utils.h和utils.cc的链接地址: https://android.googlesource.com/platform/art/+/master/runtime/utils.h
https://android.googlesource.com/platform/art/+/kitkat-release/runtime/utils.cc
IsValidJniClassName方法实现如下:
他调用了IsValidClassName方法,注意第三个参数是'/'
,这是类名的分隔符,而我这里调用FindClass时类名是使用了'.'
分隔,改成'/'
,问题就解决了。
Android5.0之后jni相关的两个修改:
1.JNI调用规则
统一类名以”/”分隔,而不兼容”.”。比如:com.linchaolong.Test要改成com/linchaolong/Test
2.动态库的搜索规则
so搜索路径统一了,比如,a.so在armeabi目录下找到了,则接下来的so都会在armeabi目录下面搜索,没有则可能出现闪退。
- 解决JNI调用在Android5.0+闪退问题
- 解决HttpClient在Android5.0系统上无效的问题
- 解决SurfaceView闪退问题
- 解决mysql闪退问题
- 解决tomcat闪退问题
- 解决Android7.0以上,手机拍照闪退的问题
- 解决Cocos3.2以上版本在Android5.0崩溃的问题
- linphone-解决3.2.5版本在Android5.0以前的系统没有H264编码的问题
- 多dex打包时在 android5.0一下报错的问题 ,有谁能解决
- android5.1简单测试在app中使用jni的库来调用串口设备
- Fragment 调用系统相机闪退问题
- android 7.0调用相机闪退问题
- android 7.0调用相机闪退问题
- 解决mac下eclipse闪退问题
- 解决google play商店闪退问题
- mysql闪退问题分析和解决
- 解决eclipse闪退的问题
- 解决Tomcat 双击闪退问题
- 关于打印机的设置
- 第一次工作杂记
- Redis--介绍以及安装(Linux环境)
- A. Elections-----------(Codeforces Round #316 (Div. 2))
- 开发中关于正则表达式使用的一个小技巧
- 解决JNI调用在Android5.0+闪退问题
- SylixOS信号系统(1)
- 排列组合算法笔记
- gcc中函数或者变量的weak属性
- 60. Event onfocus 事件
- hdoj 4324 Triangle LOVE 【拓扑排序判断是否存在可行解】
- 海思HI3518内核中开启UART2的方法
- Android FragmentManage FragmentTransaction介绍(二)
- 1<<n 和 n<<1