【问题标题】:JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchFieldError应用程序中检测到 JNI 错误:调用 JNI NewGlobalRef 时出现未决异常 java.lang.NoSuchFieldError
【发布时间】:2017-05-15 12:31:41
【问题描述】:

我正在尝试将一些本机 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 和 art 虚拟机。这是我第一次在 Android 上运行一些本机代码时遇到这个问题,我不明白为什么会收到此消息。当应用程序执行对 System.loadLibrary() 的调用时会发生这种情况,并且应用程序在执行我的本机代码之前崩溃。 有谁有想法吗?

非常感谢!

P.S : 我的 proguard 被禁用了

【问题讨论】:

  • 看看this
  • 当我尝试加载库时会出现问题,而不是在我使用它时。似乎是 System.loadLibrary() 运行的代码在找到 mNativePtr 时失败了,但根本没有原因。

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


【解决方案1】:

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

鉴于您使用的是 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");
}

【讨论】:

    【解决方案2】:

    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 不兼容。

    【讨论】:

    • 我正在使用 android API 23 平台进行编译。 Parcel 类包含字段 mNativePtr,但 Java 代码不使用该字段。也许这个字段在构建过程中会被自动删除。
    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多