2012-12-20 43 views
5

लौटाता है मैं अपने जावा क्लास में अपने सीपीपी कक्षा से कुछ फ़ंक्शन कॉल करने का प्रयास कर रहा हूं। मैं इन कॉलों को तीन बार बनाने में सफल हूं जब तक कि मैं 4 वें कार्य को कॉल नहीं करता। मैं cocos2dx इंजन का उपयोग कर रहा हूँ।env-> FindClass फ़ंक्शन शून्य

मैं MiscManagerJni.cpp

मैं निम्नलिखित त्रुटि मिलती से MiscManager.java में फ़ंक्शन को कॉल करें जब मैं CLASSID और खेल दुर्घटनाओं प्राप्त करने की कोशिश: MiscManager में

12-20 12:06:09.328: W/System.err(26651): java.lang.NoClassDefFoundError: [generic] 12-20 12:06:09.328: W/System.err(26651): at dalvik.system.NativeStart.main(Native Method) 12-20 08:56:35.402: D/libMiscManager(25952): Failed to find class of com/games/Game/MiscManager

मैं सफलतापूर्वक कार्यों कहा जाता है 3 बार MiscManagerJni.cpp वर्ग से .java क्लास। लेकिन 4 समय अशक्त दिया जाता है जब मैं

jclass ret = pEnv->FindClass(CLASS_NAME);

फोन किसी को भी मुझे बता सकते हैं क्या इस त्रुटि उत्पन्न कर रहा है।

इन कार्यों मैं विधि आईडी और वर्ग आईडी

#define LOG_TAG "libMiscManager" 
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) 
#define CLASS_NAME "com/games/Game/MiscManager" 

typedef struct JniMethodInfo_ 
{ 
    JNIEnv * env; 
    jclass  classID; 
    jmethodID methodID; 
} JniMethodInfo; 


extern "C" 

{ 
    // get env and cache it 
    static JNIEnv* getJNIEnv(void) 
    { 

    JavaVM* jvm = cocos2d::JniHelper::getJavaVM(); 
    if (NULL == jvm) { 
     LOGD("Failed to get JNIEnv. JniHelper::getJavaVM() is NULL"); 
     return NULL; 
    } 

    JNIEnv *env = NULL; 
    // get jni environment 
    jint ret = jvm->GetEnv((void**)&env, JNI_VERSION_1_4); 

    switch (ret) { 
     case JNI_OK : 
      // Success! 

      return env; 

     case JNI_EDETACHED : 
      // Thread not attached 
      if (jvm->AttachCurrentThread(&env, NULL) < 0) 
      { 
       LOGD("Failed to get the environment using AttachCurrentThread()"); 
       return NULL; 
      } else { 
       // Success : Attached and obtained JNIEnv! 
       return env; 
      } 

     case JNI_EVERSION : 

      // Cannot recover from this error 
      LOGD("JNI interface version 1.4 not supported"); 
     default : 

      LOGD("Failed to get the environment using GetEnv()"); 
      return NULL; 
    } 
} 

// get class and make it a global reference, release it at endJni(). 
static jclass getClassID(JNIEnv *pEnv) 
{ 
    jclass ret = pEnv->FindClass(CLASS_NAME); 
    if (! ret) 
    { 
     LOGD("Failed to find class of %s", CLASS_NAME); 
    } 
    return ret; 
} 

static bool getStaticMethodInfo(cocos2d::JniMethodInfo &methodinfo, const char *methodName, const char *paramCode) 
{ 
    jmethodID methodID = 0; 
    JNIEnv *pEnv = 0; 
    bool bRet = false; 

    do 
    { 
     pEnv = getJNIEnv(); 
     if (! pEnv) 
     { 
      break; 
     } 

     jclass classID = getClassID(pEnv); 

     methodID = pEnv->GetStaticMethodID(classID, methodName, paramCode); 

     if (! methodID) 
     { 
      LOGD("Failed to find static method id of %s", methodName); 
      break; 
     } 
     methodinfo.classID = classID; 
     methodinfo.env = pEnv; 
     methodinfo.methodID = methodID; 

     bRet = true; 
    } while (0); 
    return bRet; 


    } 

void InitJni() 
     { 
     cocos2d::JniMethodInfo methodInfo; 
     if (! getStaticMethodInfo(methodInfo, "Init", "()V")) 
     { 
      return ; 
     } 

    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 
} 

void SaveBooleanJni(const char *key, bool value) 
    { 
     cocos2d::JniMethodInfo methodInfo; 
     if (! getStaticMethodInfo(methodInfo, "SaveBoolean", "(Ljava/lang/String;Z)V")) 
     { 
     return; 
    } 

    jstring stringArg = methodInfo.env->NewStringUTF(key); 
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg, value); 
    methodInfo.env->DeleteLocalRef(stringArg); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 
} 

void SaveIntegerJni(const char *key, int value) 
{ 
    cocos2d::JniMethodInfo methodInfo; 
    if (! getStaticMethodInfo(methodInfo, "SaveInteger", "(Ljava/lang/String;I)V")) 
    { 
     return; 
    } 

    jstring stringArg = methodInfo.env->NewStringUTF(key); 
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg, value); 
    methodInfo.env->DeleteLocalRef(stringArg); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 
} 

void SaveLongJni(const char *key, long value) 
{ 
    cocos2d::JniMethodInfo methodInfo; 
    if (! getStaticMethodInfo(methodInfo, "SaveLong", "(Ljava/lang/String;J)V")) 
    { 
     return; 
    } 
    jstring stringArg = methodInfo.env->NewStringUTF(key); 
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg, value); 
    methodInfo.env->DeleteLocalRef(stringArg); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 
} 

long GetLongJni(const char *key, long defaultValue) 
{ 
    cocos2d::JniMethodInfo methodInfo; 
    long ret = 0; 
    if (! getStaticMethodInfo(methodInfo, "GetInteger", "(Ljava/lang/String;J)J")) 
    { 
     return ret; 
    } 

    jstring stringArg = methodInfo.env->NewStringUTF(key); 
    ret = methodInfo.env->CallStaticLongMethod(methodInfo.classID, methodInfo.methodID, stringArg, defaultValue); 
    methodInfo.env->DeleteLocalRef(stringArg); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 

    return (long)ret; 
} 

bool GetBooleanJni(const char *key, bool defaultValue) 
{ 
    cocos2d::JniMethodInfo methodInfo; 
    jboolean ret = false; 
    if (! getStaticMethodInfo(methodInfo, "GetBoolean", "(Ljava/lang/String;Z)Z")) 
    { 
     return ret; 
    } 
    jstring stringArg = methodInfo.env->NewStringUTF(key); 
    ret = methodInfo.env->CallStaticIntMethod(methodInfo.classID, methodInfo.methodID, stringArg, defaultValue); 
    methodInfo.env->DeleteLocalRef(stringArg); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 

    return ret; 
} 

int GetIntegerJni(const char *key, int defaultValue) 
{ 
    cocos2d::JniMethodInfo methodInfo; 
    int ret = 0; 
    if (! getStaticMethodInfo(methodInfo, "GetInteger", "(Ljava/lang/String;I)I")) 
    { 
     return ret; 
    } 

    jstring stringArg = methodInfo.env->NewStringUTF(key); 
    ret = methodInfo.env->CallStaticIntMethod(methodInfo.classID, methodInfo.methodID, stringArg, defaultValue); 
    methodInfo.env->DeleteLocalRef(stringArg); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 

    return (unsigned int)ret; 
} 

bool IsConnectedToNetworkJni() 
{ 
    cocos2d::JniMethodInfo methodInfo; 
    jboolean ret = false; 
    if (! getStaticMethodInfo(methodInfo, "IsConnectedToNetwork", "()Z")) 
    { 
     return ret; 
    } 

    ret = methodInfo.env->CallStaticBooleanMethod(methodInfo.classID, methodInfo.methodID); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 

    return ret; 
} 
} 
+0

getStaticMethodInfo (methodInfo, "SaveLong", "(Ljava/lang/स्ट्रिंग; जे) वी"): com/games/game/MiscManager संदर्भ कहां है? मेरे लिए ऐसा लगता है कि एक तर्क वर्ग नाम गायब है। –

+0

क्षमा करें मैंने बाकी कार्यों को जोड़ा है और जैसा कि आप देख सकते हैं कि मैंने कक्षा का नाम – glo

+0

परिभाषित किया है क्या आप अन्य कॉल के लिए काम करने वाले कोड को दिखा सकते हैं? यह अजीब लगता है कि यह कक्षा में नहीं मिला है, जबकि हम विधि पर कोई समस्या नहीं पाएंगे या कुछ और ... –

उत्तर

0

मैं cocos2dx इंजन में JNIHelper वर्ग का उपयोग करके समस्या का समाधान पाने के लिए उपयोग कर रहा हूँ कर रहे हैं। मैंने अपनी खुद की कक्षा में लिखने के बजाय जेएनआईहेल्पर क्लास में getStaticMethodInfo का उपयोग किया।