JNI 多次调用CallStaticVoidMethod 死机 ,请教!
我的程序中会,点击一下屏幕,就会调用Jni_PlayMusic(char * buffer,unsigned int length,SFBool bLoop)
方法,一开始还是好的,但是多次调用后会死机,LOG打到SFDEBUG("Jni_PlayMusic====TEST=CC");后面的LOG就都不出来了,请教修改方法,大家帮帮忙。
注:SFDEBUG是打LOG的函数,m_javavm与m_renderObj这两个变量已经在初始化时保存了数据,一开始程序是可以正常运行的。
int Jni_PlayMusic(char * buffer,unsigned int length,SFBool bLoop)
{
long status;
jclass cls;
jmethodID mid;
JNIEnv* Javaenv;
SFDEBUG("Jni_PlayMusic====Start");
SFBool isAttached = SFFalse;
bPlayMusic_Call =SFTrue;
status = (*(JavaVM *)m_javavm)->GetEnv((JavaVM *)m_javavm,(void **) &Javaenv, JNI_VERSION_1_4);
if(status < 0) {
status = (*(JavaVM *)m_javavm)->AttachCurrentThread((JavaVM *)m_javavm,&Javaenv, NULL);
if(status < 0) {
return 0;
}
isAttached = SFTrue;
}
/* Construct a Java string */
cls = (*Javaenv)->GetObjectClass(Javaenv,m_renderObj);
if(!cls) {
if(isAttached) (*(JavaVM *)m_javavm)->DetachCurrentThread((JavaVM *)m_javavm);
return 0;
}
SFDEBUG("Jni_PlayMusic====SU=333");
mid =(*Javaenv)->GetStaticMethodID(Javaenv,cls, "PlayMusic_Native", "([BZ)V");
if (mid !=0) {
jbyteArray jcarr;
SFDEBUG("Jni_PlayMusic====TEST=AA");
jcarr= (*Javaenv)->NewByteArray(Javaenv,length);
SFDEBUG("Jni_PlayMusic====TEST=BB");
(*Javaenv)->SetByteArrayRegion(Javaenv,jcarr,0,length,(jbyte*)buffer);
SFDEBUG("Jni_PlayMusic====TEST=CC");
(*Javaenv)->CallStaticVoidMethod(Javaenv,cls, mid,jcarr,bLoop);
if ((*Javaenv)->ExceptionCheck(Javaenv)==JNI_TRUE)
{
if(isAttached) (*(JavaVM *)m_javavm)->DetachCurrentThread((JavaVM *)m_javavm);
(*Javaenv)->ExceptionDescribe(Javaenv);
(*Javaenv)->ExceptionClear(Javaenv);
SFDEBUG("CALL STATIC METHOD FAILED !!!!!!!!!!!");
return 0;
}
SFDEBUG("Jni_PlayMusic====TEST=DD");
(*Javaenv)->DeleteLocalRef(Javaenv,jcarr);
}
SFDEBUG("Jni_PlayMusic====SUSS=55555");
if(isAttached) (*(JavaVM *)m_javavm)->DetachCurrentThread((JavaVM *)m_javavm);
bPlayMusic_Call =SFFalse;
SFDEBUG("Jni_PlayMusic====end");
return 1;
}