实例如下:
bool Mp3PlayerMM::loadFile(const char* filePath){ CCLOG("file path: %s", filePath); JniMethodInfo info; JNIEnv* env = NULL; if( JniHelper::getJavaVM()->AttachCurrentThread(&env,NULL) < 0) return false; int len1 = strlen(filePath)+1; char* buf1 = new char[len1]; for(int i=0; i<len1; i++){ buf1[i] = filePath[i]; } buf1[len1] = '\0'; jstring path = env->NewStringUTF(buf1);int len2 = env->GetStringLength(path);
bool ret = JniHelper::getStaticMethodInfo(info, "org/cocos2dx/cpp/AppActivity", "Mp3Player_LoadFile","(Ljava/lang/String;)Z"); info.env->CallStaticVoidMethod(info.classID, info.methodID, path); return false; }JNIENV是和线程相关的Java运行环境变量,在调用之前需要从JavaVM虚拟机上获取当前线程的JNIENV。具体方法:
JNIEnv* env = NULL; if( JniHelper::getJavaVM()->AttachCurrentThread(&env,NULL) < 0) return false;代码调用上,char *filepath需要转换成为jstring类型,作为参数传递进入java方法中:
bool ret = JniHelper::getStaticMethodInfo(info, "org/cocos2dx/cpp/AppActivity", "Mp3Player_LoadFile","(Ljava/lang/String;)Z");实现类型转换的可靠方法是:对filepath进行剪裁,生成一个长度为filepath长度的字符数组,然后调用NewStringUTF方法生成jstring网上其他方法经试验并不能正确运行,建议采用本文方法。