JNI在应用程序中检测到错误:JNI NewGlobalRef调用挂起异常java.lang.NoSuchFieldError

时间:2017-05-15 12:31:42

标签: android android-ndk google-project-tango

我正在尝试将一些本机c库加载到我的Andoid应用程序中,我收到以下错误:

  

应用程序中的JNI检测错误:JNI NewGlobalRef调用挂起异常java.lang.NoSuchFieldError:类“Landroid / os / Parcel”中没有“I”字段“mNativePtr”或其超类

以下是logcat消息的一部分:

    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchFieldError: no "I" field "mNativePtr" in class "Landroid/os/Parcel;" or its superclasses
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:435)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at void java.lang.Runtime.loadLibrary(java.lang.String, java.lang.ClassLoader) (Runtime.java:370)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at void java.lang.System.loadLibrary(java.lang.String) (System.java:1076)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at void fr.limsi.registration.utils.NativeInterface.<clinit>() (NativeInterface.java:12)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at void fr.limsi.registration.utils.NativeInterface.tangoInitServices() (NativeInterface.java:-2)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at void fr.limsi.registration.activities.ProjectViewActivity.onStart() (ProjectViewActivity.java:63)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at void android.app.Instrumentation.callActivityOnStart(android.app.Activity) (Instrumentation.java:1238)
    05-15 14:08:03.177 21078-21078/fr.limsi.registration A/art: art/runtime/java_vm_ext.cc:410]   at void android.app.Activity.performStart() (Activity.java:6302)

我将此解释为:

  

类android.od.Parcel没有任何名为“mNativePtr”的字段。

我使用的是联想PHAB II平板电脑,与Abdroid 6.0一起运行,以及艺术虚拟机。这是我第一次在Android上运行一些本机代码时遇到此问题,我不明白为什么会收到此消息。它发生在应用程序执行对System.loadLibrary()的调用时,应用程序在执行我的本机代码之前崩溃。 有谁有想法吗?

非常感谢!

P.S:我的节目被禁用

2 个答案:

答案 0 :(得分:2)

我使用Google Tango库遇到了这个问题,但我还没有找到解决方案。对不起,我还没有足够的业力发表评论。

鉴于您使用的是Google Tango设备,我认为您的问题与我的问题相同。谷歌探戈的东西。

编辑:

解决了它。首先加载tango_client_api.so,然后再加载其他内容:

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.
static {
    // This project depends on tango_client_api, so we need to make sure we load
    // the correct library first.
    if (com.projecttango.examples.cpp.util.TangoInitializationHelper.loadTangoSharedLibrary() ==
            com.projecttango.examples.cpp.util.TangoInitializationHelper.ARCH_ERROR) {
        Log.e("TangoJNINative", "ERROR! Unable to load libtango_client_api.so!");
    }
    System.loadLibrary("native-lib");
}

答案 1 :(得分:0)

Android已将类android.os.Parcel的内部实现从版本4.0更改为4.1。

在版本4.1.1中有:

@SuppressWarnings({"UnusedDeclaration"})
private int mNativePtr; // used by native code
/**
 * Flag indicating if {@link #mNativePtr} was allocated by this object,
 * indicating that we're responsible for its lifecycle.
 */
private boolean mOwnsNativeParcelObject;

在版本4.0.4中有:

@SuppressWarnings({"UnusedDeclaration"})
private int mObject; // used by native code
@SuppressWarnings({"UnusedDeclaration"})
private int mOwnObject; // used by native code

您的其他原生C库似乎与Android 4.1兼容,但与Android 4.0不兼容。