【问题标题】:Android JNI stale local reference errorAndroid JNI 过时的本地引用错误
【发布时间】:2014-02-12 00:24:58
【问题描述】:

我正在尝试从本机代码调用 System.getProperty(String)。但我在尝试在 android 4.1.2 上运行时遇到此错误:

    JNI ERROR: (app bug): accessed stale local reference ......... (index .... in a table of size 0) 

源码如下:

JNIEXPORT jstring JNICALL Java_org_morphone_sense_device_DeviceSense_getArchNative
  (JNIEnv *pEnv, jobject pObj) {
jclass SCls = (*pEnv)->FindClass(pEnv, "java/lang/System");
if (!SCls)
    return NULL;
    jmethodID getPropertyMID = (*pEnv)->GetStaticMethodID(pEnv, SCls, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
    jobject property = (*pEnv)->CallStaticObjectMethod(pEnv, SCls, getPropertyMID, "os.version");
}

有人知道如何解决这个错误吗?

【问题讨论】:

    标签: android reference java-native-interface


    【解决方案1】:

    我发现了问题。我不需要将字符串传递给 CallStaticObjectMethod,而是需要构造一个 jstring 实例然后传递它。工作代码应该是:

    JNIEXPORT jstring JNICALL Java_org_morphone_sense_device_DeviceSense_getArchNative
      (JNIEnv *pEnv, jobject pObj) {
        jclass SystemCls = (*pEnv)->FindClass(pEnv, "java/lang/System");
        jstring propertyName = (*pEnv)->NewStringUTF(pEnv, "os.arch");
    
    jmethodID getPropertyMID = (*pEnv)->GetStaticMethodID(pEnv, SystemCls, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
    jstring property = (*pEnv)->CallStaticObjectMethod(pEnv, SystemCls, getPropertyMID, propertyName);
    
    if (property!=NULL) {
        __android_log_print(ANDROID_LOG_INFO, "Morphone", "Got property");
        return property;
    }
    else {
        __android_log_print(ANDROID_LOG_INFO, "Morphone", "Error: Cannot get property");
        return "";
    }
    }
    

    【讨论】:

      【解决方案2】:

      改变

      public native String getArchNative();
      

      public String getArchNative()
      {
          return System.getProperty("os.version");
      }
      

      然后扔掉 JNI 代码。不要为自己创建工作,也不要创建需要维护的额外源文件。

      如果在这个阶段可能的话,我也会从方法名称中删除“Native”。

      【讨论】:

      • 我想使用本机代码,因为这是这里的要求(虽然它似乎没用)
      猜你喜欢
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多