解决jni调用在Android5.x系统闪退问题

日志信息如下:

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时类名是使用了‘.‘分隔,改成‘/‘,问题就解决了。

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

时间: 2024-12-22 19:29:48

解决jni调用在Android5.x系统闪退问题的相关文章

解决Xilinx_ISE在Win8下打开崩溃闪退的方法

解决Xilinx_ISE在Win8下打开崩溃闪退的方法 在64位windows8或者8.1上安装xilinx ise之后,加载 licence或者保存文件的时候,ise应用程序就会崩溃,出现闪退的情况. 修复方法: 第一步: 找到xilinx安装文件下的子文件,我的是安装在D盘. [plain] view plaincopy D:\Xilinx\14.4\ISE_DS\ISE\lib\nt64 在这个文件夹中搜索文件 libPortability 会出来两个文件 [plain] view pla

解决关于ios访问相机闪退问题

在mac上的ionic3项目打包成苹果app,系统版本是10.3.3 . 当调用相机的时候出现闪退情况,这是调试出现的问题: This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSCameraUsageDescription key with a string va

【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studio默认采用的却是gradle方式,与ADT编辑的方式大不相同,那再andorid studio中如何导入so文件呢? 在android studio 中我们可能会用到jar包和so文件的方式,对于jar包可能接触更多,只需要我们把工程转换为project显示方式,打开app下的libs文件夹,导入即

XP系统下Chrome浏览器打开某些网站闪退的解决办法

这个星期用Chrome浏览网站的过程中,突然出现没有什么提示的闪退现象.一开始没怎么注意,以为只是偶然现象,但当重启Chrome后点恢复按钮再次闪退,这就可以肯定是因为打开某些网站造成.于是再次重启Chrome浏览器并按下恢复按钮,在可能导致Chrome闪退那个网站打开之前关闭那个分页,这样Chrome就不闪退了.这个办法只能治标不能治本,下次再打开这个网站同样会出现闪退的现象. 为了彻底解决这个问题,于是就用搜索引擎找找看有没有解决办法.首先用"Chrome打开某些网站闪退"作为关键

升级iOS8和iOS9系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式

升级iOS8和iOS9.iOS10系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式 查看设备iOS操作系统版本号号办法:iPhone/iPad->设置->通用->关于本机->版本号 a.假设iPhone/iPad操作系统是iOS8.3之后(比方iOS8.3.iOS8.4.iOS9.iOS10),则关闭全部网络或开启飞行模式,看保险箱Pro还闪退不.假设不闪退,则立即进入闪退app(保险箱Pro.私人保险箱.私密相冊).上传全部照片和视频到手机系统相冊.以后使用这个

Ubuntu 16.04系统下软件中心Software闪退解决办法

按住Ctrl+Alt+T打开终端输入: sudo apt-get update //更新 sudo apt-get dist-upgrade //升级 sudo apt-get install --reinstall software-center //重新安装 重新打开软件中心Software即可解决闪退问题:

Xcode7打包,iOS9真机闪退,如何解决?

有些项目用xcode7打开运行,打包安装到iOS9设备上程序会闪退.如果用xcode7以下编译,然后打包到iOS9的设备上就是正常的.这是为什么,关键是,怎么解决? 答:iOS9发布之后,有些app在新的系统下会经常出现闪退的情况,而官方也给了许多的适配与改变.以使用户体验更好.所以做为开发者怎样为自己维护的App做适配呢? 最快解决的方法肯定是使用Xcode7以下的编译打包.(笔者就是因为需求一直在催,所以果断用旧版Xcode5编译...555) 当然,如果一定要用Xcode7的话也可以解决,

android内核剖析系列---JNI调用机制分析

为什么需要JNI? android这个庞大的系统从下到上主要由linux内核,C/C++库,java应用程序框架,java应用程序组成.这就涉及到一个问题,C/C++库如何与java应用有交集,或者说能相互调用,要解决这个问题,就需要JNI登场了. JNI调用机制分析 JNI--java native interface,翻译成中文是java本地接口,所谓的"本地"是指C/C++库一层的C/C++语言(以下统称C).

Java通过JNI调用dll详细过程(转)

源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无需再次登录直接进入平台,CS软件方提供了一个加密解密的dll文件,我们需要在action中通过该dll解密,那么就涉及到java调用dll的问题. 首先我选择了JNI方式(因为网上说的另两种方式Jawin, Jacob更不会),大体流程如下: 1.写一个java的class,在类里声明所调用的库名称