android icon indicating copy to clipboard operation
android copied to clipboard

JNI Exception when accessing static fields of some Android classes

Open petekanev opened this issue 7 years ago • 1 comments

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:

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

petekanev avatar Mar 20 '17 14:03 petekanev

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.

darind avatar May 28 '18 15:05 darind