我是java调C
jclass strClass = (*env)->FindClass(env, "java/lang/String;");
 LOGD("strClass===%s\n", strClass);
打印总是为null,就是strClass为NULL。
这是怎么回事?代码哪里有问题?

解决方案 »

  1.   

    strClass  这个是对象好吧,对象能直接打印吗?显然不能,你想打印的是对象的名字,不需要getname然后才能打印
      

  2.   

    我不管strClass打印出来时啥,只要不是NULL,就是正确的。谢谢你的回复,我已经解决了,改成
    jclass strClass = (*env)->GetObjectClass(env, obj);
    但是接下来的这句ctorID又打印为NULL,<get>是我在java里的native函数名.
    jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<get>", "(Ljava/lang/String;)V");
      

  3.   


    JNIEnv* env = getJNIEnv();
    jclass sclass = env->FindClass(classPathName);
           //classPathName是我的类名(“com/game/jnicomponents/JNIQuickPlayer”)
    jmethodID method_id = env->GetMethodID(sclass, "initSoundPlayer","()V");
    env->CallVoidMethod(quickplayer_real_object, method_id);
    env->DeleteLocalRef(sclass);不知道能不能帮到您。
      

  4.   

    quickplayer_real_object这个在哪里定义的?
      

  5.   

    quickplayer_real_object这个在哪里?
      

  6.   

    quickplayer_real_object是一个对象的实例
    quickplayer_real_object = env->NewGlobalRef(gObject);gObject就是jobject,我是在JAVA层写了一个native initC();的方法,它会调一下,于是就有jobject
      

  7.   

    我是第一次搞JNI,又不懂C语言,你能把整个方法的代码贴上来么?
     "initSoundPlayer",这个是你在JAVA里面定义的native函数么?
    "()V"这个呢?我要返回的是jstring类型的.我是要把一个char*数组转成jstring
      

  8.   


    你在JAVA类中多写一个native initC()的方法。程序System.load("");的时候会自动调用C中的jniload方法。在这个方法中注册各种native方法,和保存event.程序运行的时候你在JAVA层调一下Object.initC();这样就会调到c层的initC();在这个方法中保存一下jobject,至于char转jstring,jstring 转char以下代码可以帮助您。
    #include <OperateSymbol.h>jstring s2Jstring(JNIEnv* env, const char* pat)
    {
    int        strLen    = strlen(pat);
    jclass     jstrObj   = (env)->FindClass("java/lang/String");
    jmethodID  methodId  = (env)->GetMethodID(jstrObj, "<init>", "([BLjava/lang/String;)V");
    jbyteArray byteArray = (env)->NewByteArray( strLen);
    jstring    encode    = (env)->NewStringUTF("gbk");
    (env)->SetByteArrayRegion(byteArray, 0, strLen, (jbyte*)pat);
    return (jstring)(env)->NewObject(jstrObj, methodId, byteArray, encode);
    }char* jstring2string(JNIEnv* env, jstring jstr)
    {
         char* rtn = NULL;
         jclass clsstring = env->FindClass("java/lang/String");
         jstring strencode = env->NewStringUTF("utf-8");
         jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
         jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
         jsize alen = env->GetArrayLength(barr);
         jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
         if (alen > 0)
         {
             rtn = (char*)malloc(alen + 1);
             memcpy(rtn, ba, alen);
             rtn[alen] = 0;
         }
         env->ReleaseByteArrayElements(barr, ba, 0);
         return rtn;
    }这个就不须解释啦吧。