android
android copied to clipboard
JNI Exception when accessing static fields of some Android classes
Tell us about the problem
Attempting to access some static constants of certain classes will result in the following exception:
JNI DETECTED ERROR IN APPLICATION: static jfieldID X not valid for class Y
Known conflicting classes and fields:
-
android.provider.ContactsContract.Data
- EXTRA_ADDRESS_BOOK_INDEX (API 21+)
- EXTRA_ADDRESS_BOOK_INDEX_COUNTS (API 21+)
- EXTRA_ADDRESS_BOOK_INDEX_TITLES (API 21+)
Please provide the following version numbers that your issue occurs with:
- Runtime(s): 2.5
Did the error happen while the app was being constructed? (buildtime error)
C++ Stacktrace
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: static jfieldID 0x707ff280 not valid for class java.lang.Class<android.provider.ContactsContract$Data>
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] in call to GetStaticObjectField
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] from java.lang.Object com.tns.Runtime.callJSMethodNative(int, int, java.lang.String, int, boolean, java.lang.Object[])
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] "main" prio=5 tid=1 Runnable
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] | group="main" sCount=0 dsCount=0 obj=0x740842a0 self=0xb4cf6500
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] | sysTid=14495 nice=0 cgrp=default sched=0/0 handle=0xb6f04b34
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] | state=R schedstat=( 1323742611 224979275 776 ) utm=106 stm=26 core=0 HZ=100
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] | stack=0xbe7d4000-0xbe7d6000 stackSize=8MB
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] | held mutexes= "mutator lock"(shared held)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #00 pc 00370e01 /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::ArtMethod*, void*)+160)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #01 pc 0035046f /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+150)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #02 pc 0025a725 /system/lib/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+740)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #03 pc 0025adfd /system/lib/libart.so (art::JavaVMExt::JniAbortV(char const*, char const*, std::__va_list)+64)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #04 pc 000fd1d1 /system/lib/libart.so (art::ScopedCheck::AbortF(char const*, ...)+32)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #05 pc 00114ab1 /system/lib/libart.so (art::ScopedCheck::CheckFieldAccess(art::ScopedObjectAccess&, _jobject*, _jfieldID*, bool, art::Primitive::Type)+452)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #06 pc 001164d5 /system/lib/libart.so (art::CheckJNI::GetField(char const*, _JNIEnv*, _jobject*, _jfieldID*, bool, art::Primitive::Type)+524)
03-20 10:08:31.054 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #07 pc 00116a6f /system/lib/libart.so (art::CheckJNI::GetStaticObjectField(_JNIEnv*, _jclass*, _jfieldID*)+30)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #08 pc 00501870 /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (_JNIEnv::GetStaticObjectField(_jclass*, _jfieldID*)+60)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #09 pc 00501818 /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (tns::JEnv::GetStaticObjectField(_jclass*, _jfieldID*)+56)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #10 pc 0048bea4 /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (tns::FieldAccessor::GetJavaField(v8::Isolate*, v8::Local<v8::Object> const&, tns::FieldCallbackData*)+7292)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #11 pc 0035e70c /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (tns::CallbackHandlers::GetJavaField(v8::Isolate*, v8::Local<v8::Object> const&, tns::FieldCallbackData*)+56)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #12 pc 0042483c /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (tns::MetadataNode::FieldAccessorGetterCallback(v8::Local<v8::String>, v8::PropertyCallbackInfo<v8::Value> const&)+2052)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #13 pc 007ac9b7 /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (???)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #14 pc 0084fd1f /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (v8::internal::Object::GetPropertyWithAccessor(v8::internal::LookupIterator*)+262)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #15 pc 0086c79b /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (v8::internal::Object::GetProperty(v8::internal::LookupIterator*)+186)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #16 pc 007b0859 /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (v8::internal::LoadIC::Load(v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Name>)+84)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #17 pc 007b370f /data/app/com.tns.android_runtime_testapp-1/lib/arm/libNativeScript.so (v8::internal::Runtime_LoadIC_Miss(int, v8::internal::Object**, v8::internal::Isolate*)+478)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] native: #18 pc 00000098 (???)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.tns.Runtime.callJSMethodNative(Native method)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1021)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.tns.Runtime.callJSMethodImpl(Runtime.java:903)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.tns.Runtime.callJSMethod(Runtime.java:890)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.tns.Runtime.callJSMethod(Runtime.java:874)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.tns.Runtime.callJSMethod(Runtime.java:866)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.tns.gen.android.view.View_OnClickListener.onClick(android.view.View$OnClickListener.java:-1)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at android.view.View.performClick(View.java:5204)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at android.view.View$PerformClick.run(View.java:21153)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at android.os.Handler.handleCallback(Handler.java:739)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at android.os.Handler.dispatchMessage(Handler.java:95)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at android.os.Looper.loop(Looper.java:148)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at android.app.ActivityThread.main(ActivityThread.java:5417)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at java.lang.reflect.Method.invoke!(Native method)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-20 10:08:31.055 14495-14495/com.tns.android_runtime_testapp A/art: art/runtime/java_vm_ext.cc:410]
Did the error happen while the app was executing? (runtime error)
Yes.
Please tell us how to recreate the issue in as much detail as possible.
accessing android.provider.ContactsContract.Data.EXTRA_ADDRESS_BOOK_INDEX
anywhere in code crashes the app.
Tested on Genymotion Emulators: API 21, API 23 Tested on Real Nexus 5 Device: API 23
After digging further into this, it turns out that the EXTRA_ADDRESS_BOOK_INDEX
field is declared inside а non-public ContactCounts interface. When querying the list of implemented interfaces by the android.provider.ContactsContract.Data
class, this non-public interface is not returned.
Тhe proper JNI signature to access this field is android/provider/ContactsContract$ContactCounts
instead of android/provider/ContactsContract$Data
.
But since the runtime has no knowledge of this ContactCounts
interface it is not possible to generate the proper signature.
A possible workaround is to expose this field from a native plugin.