我正在尝试将一些本机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:我的节目被禁用
答案 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不兼容。