2012-12-20 7 views
5

私のJavaクラスのいくつかの関数を私のcppクラスから呼び出そうとしています。私は4回目の呼び出しまでこれらの呼び出しを3回行うことに成功しています。私はcocos2dxエンジンを使用しています。env-> FindClass関数がnullを返します

私はのclassIDとゲームがクラッシュを取得しようとすると、私は次のエラーを取得する

MiscManagerJni.cpp

からMiscManager.javaで関数を呼び出します。

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

私は成功しMiscManagerに機能3回呼ばれていますMiscManagerJni.cppクラスの.javaクラス私は誰もがこのエラーの原因となっているものを教えてもらえます

jclass ret = pEnv->FindClass(CLASS_NAME);

を呼び出すときには4回目のヌルが返されます。

これらは私が

#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/String; J)V"):com/games/Game/MiscManagerリファレンスはどこですか?私にとっては、1つの引数classnameが見つからないようです。 –

+0

残念ですが残った関数を追加しました。クラス名を定義したのがわかります – glo

+0

他の呼び出しで動作するコードを表示できますか?私たちはメソッドや他の何かに問題があると期待している間に、クラスが見つからないのは不思議そうです... –

答えて

0

メソッドIDとクラスIDを取得するために使用しています機能している私はcocos2dxエンジンでJNIHelperクラスを使用して問題を解決しました。 私自身のクラスで書くのではなく、JNIHelperクラスでgetStaticMethodInfoを使用しました。

関連する問題