2014-02-12 2 views
0

네이티브 코드에서 System.getProperty (String)를 호출하려고합니다.Android JNI 부실 로컬 참조 오류

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"); 
} 

사람은이 오류를 수정하는 방법을 알고 있지만 안드로이드 4.1.2에서 실행하는 동안이 오류가있어?

답변

1

변경

public native String getArchNative(); 

에 멀리 JNI 코드를 던져. 직접 작업하거나 maintaned해야하는 추가 소스 파일을 만들지 마십시오.

이 단계에서 가능한 경우 메소드 이름에서 '네이티브'도 제거합니다.

+0

여기에는 요구 사항이므로 기본 코드를 사용하고 싶습니다. (쓸모없는 것 같지만) – VinhJune

2

문제점을 발견했습니다. 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 ""; 
} 
} 
관련 문제