2011-09-12 13 views
5

का उपयोग कर देशी धागे से जावा विधि पर कॉल करने में समस्या मेरे पास एक जेएनआई समस्या है जो मुझे उम्मीद है कि कोई मेरी मदद कर सकता है।
मैं मूल थ्रेड से LUSOutputJNI नामक जावा क्लास के निर्माता पर कॉल करने का प्रयास कर रहा हूं।
यह इस विशिष्ट श्रेणी के FindClass (...) पर असफल रहता है।जेएनआई (सी ++)

E/lusCore_JNI(3040): 1 
E/lusCore_JNI(3040): 2 
E/lusCore_JNI(3040): AttachCurrentThread was successful 
E/lusCore_JNI(3040): 3 
E/lusCore_JNI(3040): Can't find class LUSOutputJNI 
E/lusCore_JNI(3040): 4 
W/dalvikvm(3040): JNI WARNING: JNI method called with exception raised 

टिप्पणियों::

  • मैं से एक परिणाम प्राप्त

    LOGE("1"); 
        JNIEnv *env = NULL; 
    
        LOGE("2"); 
        int res = -1; 
        res = g_vm->AttachCurrentThread(&env, NULL); 
    
        if(env == NULL) 
        { 
         LOGE("env is NULL, AttachCurrentThread failed");; 
        } 
    
    
        if(res >= 0) 
         LOGE("AttachCurrentThread was successful"); 
        jclass clazz = NULL; 
        jmethodID cid; 
    
        jclass clazzESEngine; 
        jmethodID callbackid; 
    
        jobject jCoreOut; 
        static jfieldID fid_ActionState = NULL; 
        static jfieldID fid_nSpeed = NULL; 
        static jfieldID fid_nType = NULL; 
        static jfieldID fid_nInProcess = NULL; 
        static jfieldID fid_nX = NULL; 
        static jfieldID fid_nY = NULL; 
        LOGE("3"); 
    
        static const char* const ECOClassName = "lus/android/sdk/LUSOutputJNI"; 
        //static const char* const ECOClassName = "android/widget/TextView"; 
        clazz = env->FindClass(ECOClassName); 
        if (clazz == NULL) { 
         LOGE("Can't find class LUSOutputJNI"); 
    
        } 
        else 
         LOGE("lus/android/sdk/LUSOutputJNI was found, YEY!!"); 
    
        LOGE("4"); 
        cid = env->GetMethodID(clazz,"<init>", "()V"); 
        LOGE("5"); 
        jCoreOut = env->NewObject(clazz, cid); 
    
        LOGE("6");  
    

    यहाँ जब यह विफल से logcat उत्पादन होता है:

    यहाँ कोड है AttachCurrentThread जो 0 है, whic एच का मतलब है कि यह लगाव सफल रहा + एनवी पॉइंटर अब पूर्ण नहीं है।

  • मैं LUSOutputJNI के पैकेज के नाम घोषणा के बारे में यकीन है (ट्रिपल यह जाँच ...)
  • जब मैं इस तरह के एंड्रॉयड/विजेट/TextView के रूप में एक और अधिक लोकप्रिय वर्ग के नाम के साथ FindClass (..) चलाने का प्रयास, मैं एक सकारात्मक मैच प्राप्त करें। यह वहाँ है। मतलब थ्रेड अटैचमेंट और एनवी वैरिएबल ठीक है। (क्या मुझे लगता है कि?)
  • जब मैं एक जेएनआई विधि से निम्नलिखित कोड चलाने की कोशिश करता हूं जिसमें जेएनआई थ्रेड चल रहा है, तो उसे बिना किसी समस्या के LUSOutputJNI क्लास मिलती है।

मैं क्या गलत कर रहा हूं?

मदद की बहुत सराहना की जाएगी :)

अपने समय के लिए धन्यवाद,

इता

+0

इस 'LUSOutputJNI' वर्ग का कोई संदर्भ? –

+0

@ के-बॉलो: यह शायद एक इन-हाउस क्लास है। –

+0

@Ita: क्या आपका LUSOutputJNI स्थैतिक प्रारंभकर्ता अपवाद फेंक रहा है? आपको उठाए गए अपवाद को मुद्रित करना चाहिए। –

उत्तर

6

यहां उत्तर के आसपास \ काम मिला। (एफएक्यू के लिए देखो: JNI tips में "FindClass मेरी कक्षा नहीं मिली"

मैं मूल रूप से आवश्यक jclass वस्तुओं को वैश्विक रेफरी सहेजता हूं।
कोड को संकलित करने के लिए सी/जेएनआई और सी ++/जेएनआई के बीच कुछ बुराई जेएनआई परिवर्तनों को दूर करना पड़ा था।
इस तरह मैं संकलित और काम करने के लिए NewGlobalRef मिला।

jclass localRefCls = env->FindClass(strLUSClassName); 
if (localRefCls == NULL) { 
    LOGE("Can't find class %s",strLUSCoreClassName); 
    return result; 
} 

//cache the EyeSightCore ref as global 
/* Create a global reference */ 
clazzLUSCore = (_jclass*)env->NewGlobalRef(localRefCls); 

/* The local reference is no longer useful */ 
env->DeleteLocalRef(localRefCls); 

/* Is the global reference created successfully? */ 
if (clazzLUSCore == NULL) { 
    LOGE("Error - clazzLUSCore is still null when it is suppose to be global"); 
    return result; /* out of memory exception thrown */ 
} 

मुझे उम्मीद है कि यह किसी की भी मदद करेगा।

+0

धन्यवाद, इससे मदद मिली। स्थानीय रेफरी को यहां हटाना वाकई जरूरी है? मेरा मानना ​​है कि जब फ़ंक्शन वापस आता है तो वे स्वचालित रूप से हटा दिए जाते हैं: http://android-developers.blogspot.co.il/2011/11/jni-local-reference-changes-in-ics.html – snowdragon

2

में थोड़ा और अधिक जानकारी प्राप्त करने के बारे में गलत हो रहा क्या (यह stderr करने के लिए, LOGE नहीं प्रवेश करेंगे, और मुझे यकीन है कि बदलने का तरीका) आप कुछ अपवाद मुद्रण जोड़ सकते हैं नहीं कर रहा हूँ - आप इसे बदल सकते हैं:

//static const char* const ECOClassName = "android/widget/TextView"; 
clazz = env->FindClass(ECOClassName); 
if (clazz == NULL) { 
    LOGE("Can't find class LUSOutputJNI"); 

} 
else 
    LOGE("lus/android/sdk/LUSOutputJNI was found, YEY!!"); 
इस के लिए

:

//static const char* const ECOClassName = "android/widget/TextView"; 
    clazz = env->FindClass(ECOClassName); 
    if (clazz == NULL) { 
     LOGE("Can't find class LUSOutputJNI"); 
     jthrowable exc = env->ExceptionOccurred(); 
     if(exc) 
     { 
      env->ExceptionDescribe(); 
      env->ExceptionClear(); 
     }  
    } 
    else 
     LOGE("lus/android/sdk/LUSOutputJNI was found, YEY!!"); 
+1

ऐसा लगता है कि आप jthrowable के अंदर toString फ़ंक्शन का उपयोग करके त्रुटि जानकारी प्राप्त कर सकते हैं, और उसके बाद इसे एक सी स्ट्रिंग में परिवर्तित कर सकते हैं और उसे अपने 'LOGE' फ़ंक्शन में डाल सकते हैं, लेकिन यह डिबगिंग के लिए ओवरकिल हो सकता है। –

संबंधित मुद्दे