標籤:android5-x jni 閃退
日誌資訊如下:
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時類名是使用了‘.‘分隔,改成‘/‘,問題就解決了。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
解決jni調用在Android5.x系統閃退問題