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] 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目录下面搜索,没有则可能出现闪退。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值