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);
ध्यान दें कि मैं किसी भी कार्रवाई त्रुटियों की जांच करने के लिए नहीं ले लिया है:
मुझे लगता है कि आपको एक वैरिएबल नाम के रूप में स्ट्रेल का उपयोग नहीं करना चाहिए क्योंकि यह एक मौजूदा मानक सी फ़ंक्शन है। –
मेरे अनुभव में, आपको वास्तव में "कक्षा वस्तु प्राप्त करने" के तहत चरणों की आवश्यकता नहीं है; 'clsObj' और' cls' कार्यात्मक रूप से समकक्ष हैं। – shawkinaw
नमूना कोड "जैसा है" उपयोग किए जाने पर स्थानीय संदर्भों को क्षीण रूप से लीक कर रहा है। सभी जॉबजेक्ट और jclass संदर्भ हटा दिए जाने चाहिए। इसके अलावा, यह एक बुरा अभ्यास है: jclass cls = env-> GetObjectClass (obj); ... cls = env-> GetObjectClass (clsObj); सीएल में संग्रहीत पिछले संदर्भ को मुक्त किए बिना। –