2012-10-04 11 views
14

क्या कोई तरीका है कि मैं कक्षा के नाम को जान सकता हूं जिसे जेएनआई सी कोड में एक विधि कहा जाता है? मैं निम्नलिखित कथन का उपयोग कर कक्षा का संदर्भ प्राप्त कर सकता हूं:क्या मैं कक्षा के नाम को जान सकता हूं जो जेएनआई सी विधि कहता है?

jclass cls = (*env)->GetObjectClass(env,obj); 

लेकिन क्या मैं कक्षा के नाम को जान सकता हूं? ।

उत्तर

35

इस कोड को आप बुला वर्ग के नाम दे देंगे। यह सिर्फ एक छोटा कोड स्निपेट है जो वर्णन करता है कि यह कैसे किया जा सकता है। के बाद से स्ट्रिंग स्थानीय बफर में कॉपी किया है जारी करने के लिए कोई ज़रूरत नहीं

// Make sure that the buffer is large enough 
char str[128]; 
jint strlen = env->GetStringUTFLength(strObj); 
env->GetStringUTFRegion(strObj, 0, strlen, str); 
printf("\nCalling class is: %s\n", str); 

:


वैकल्पिक रूप से आप के बजाय GetStringUTFChars/ReleaseStringUTFChars का उपयोग कर के ऐसा कर सकता है।

+1

मुझे लगता है कि आपको एक वैरिएबल नाम के रूप में स्ट्रेल का उपयोग नहीं करना चाहिए क्योंकि यह एक मौजूदा मानक सी फ़ंक्शन है। –

+0

मेरे अनुभव में, आपको वास्तव में "कक्षा वस्तु प्राप्त करने" के तहत चरणों की आवश्यकता नहीं है; 'clsObj' और' cls' कार्यात्मक रूप से समकक्ष हैं। – shawkinaw

+0

नमूना कोड "जैसा है" उपयोग किए जाने पर स्थानीय संदर्भों को क्षीण रूप से लीक कर रहा है। सभी जॉबजेक्ट और jclass संदर्भ हटा दिए जाने चाहिए। इसके अलावा, यह एक बुरा अभ्यास है: jclass cls = env-> GetObjectClass (obj); ... cls = env-> GetObjectClass (clsObj); सीएल में संग्रहीत पिछले संदर्भ को मुक्त किए बिना। –

-3

jclass पर, getName() पर जेएनआई के माध्यम से भी आग्रह करें।

jclass cls = env->GetObjectClass(obj); 

// First get the class object 
jmethodID mid = env->GetMethodID(cls, "getClass", "()Ljava/lang/Class;"); 
jobject clsObj = env->CallObjectMethod(obj, mid); 

// Now get the class object's class descriptor 
cls = env->GetObjectClass(clsObj); 

// Find the getName() method on the class object 
mid = env->GetMethodID(cls, "getName", "()Ljava/lang/String;"); 

// Call the getName() to get a jstring object back 
jstring strObj = (jstring)env->CallObjectMethod(clsObj, mid); 

// Now get the c string from the java jstring object 
const char* str = env->GetStringUTFChars(strObj, NULL); 

// Print the class name 
printf("\nCalling class is: %s\n", str); 

// Release the memory pinned char array 
env->ReleaseStringUTFChars(strObj, str); 

ध्यान दें कि मैं किसी भी कार्रवाई त्रुटियों की जांच करने के लिए नहीं ले लिया है:

+0

आपका मतलब '((* env) -> GetObjectClass (env, obj)) -> getName()'? मैं जेनी सी कोड –

+1

से कक्षा के नाम (जिसने विधि को बुलाया) प्रिंट करना चाहता हूं, जब मैं ऊपर या 'jclass-> getName() ' –

+2

FYI - आमतौर पर बोलता हूं, जब आप वर्णन करते हैं कि मुझे क्या त्रुटि है हो चुका है, और क्या त्रुटि संदेश, आदि ... आपको सफल होने से रोक रहे हैं, आपको बेहतर मदद मिलेगी। ईजेपी की प्रतिक्रिया सही है। यह जानने के बिना कि आप क्या त्रुटि प्राप्त कर रहे हैं, हम इस बारे में टिप्पणी करना शुरू नहीं कर सकते कि क्या काम नहीं कर रहा है। याद रखें कि getName() एक jstring वापस करने जा रहा है ... –

7

मेरे मामले में, मेरे पास कक्षा पाने का उद्देश्य नहीं है। इसके बजाय, मैं अपने हस्ताक्षर के आधार पर किसी दिए गए वर्ग का नाम प्राप्त करना चाहता था।

तो, यह मेरे लिए काम किया। मुझे उम्मीद है कि यह मदद कर सकता है:

// Find the class by its JNI signature 
jclass cls = env->FindClass(expectedType); 

// Get the class object's class descriptor 
jclass clsClazz = env->GetObjectClass(cls); 

// Find the getSimpleName() method in the class object 
jmethodID methodId = env->GetMethodID(clsClazz, "getSimpleName", "()Ljava/lang/String;"); 
jstring className = (jstring) env->CallObjectMethod(cls, methodId); 

// And finally, don't forget to release the JNI objects after usage!!!! 
env->DeleteLocalRef(clsClazz); 
env->DeleteLocalRef(cls); 

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

  • कोई संबंधित समस्या नहीं^_^