Win32下c++调用java实现磁盘MP3扫描:
/***************************此处用到jni.h及jni_md.h,其中jni.h是jdk下的,不是ndk下的*****************************/
void getJavaMethod(){
JavaVMOption options[4];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
typedef jint (WINAPI* JNICreateJavaVM)(JavaVM**, JNIEnv**, void *);// typedef的功能是定义新的类型
long status;
jclass cls;
jmethodID mid;
//------------------------------加载jvm
HINSTANCE jvmDll = LoadLibrary(TEXT("D:\\Software_install\\code\\Keith_Cocos2dx2.2.0\\cocos2dx32\\Java\\jdk1.7.0_40\\jre\\bin\\server\\jvm.dll"));
if (jvmDll == NULL)
CCLOG("加载JVM动态库错误。%l", ::GetLastError());
//查找JNI_CreateJavaVM过程。
JNICreateJavaVM jvmCreateProc = (JNICreateJavaVM)GetProcAddress(jvmDll, "JNI_CreateJavaVM");
if (jvmCreateProc == NULL)
{
FreeLibrary(jvmDll);
CCLOG("查找JNI_CreateJavaVM过程错误。%l", ::GetLastError());
return;
}
//自定义类的路径
options[0].optionString = "-Djava.compiler=NONE"; // disable JIT
//F:\\Keith_Code\\Keith_Java\\SD\\libs\\android-support-v4.jar;
//需设置类路径,还需要设置java支持的jar路径!!!!!!!!
options[1].optionString = "-Djava.class.path=F:\\Keith_Code\\Keith_Java\\SD\\bin\\classes;D:\\Software_install\\code\\Keith_Cocos2dx2.2.0\\cocos2dx32\\sdk\\platforms\\android-19\\android.jar";// user classes
options[2].optionString = "-Djava.library.path=jvmLib"; // set native library path
options[3].optionString = "-verbose:jni"; // print JNI-related messages
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 4;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
//创建JVM:
status = (jvmCreateProc)(&jvm, (JNIEnv **)&env, &vm_args);//创建失败时status等于-4,重启工程后解决了,不清楚。
if (status < 0 || jvm == NULL || env == NULL)
{
FreeLibrary(jvmDll);
CCLOG( "创建JVM发生错误。");
return;
}
//设置动态链接库:添加延迟加载即可 不可直接将jvm.dll复制,这样可能缺少文件,导致JNI_CreateJavaVM失败
//status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status != JNI_ERR)
{
//注意包的写法是'/'
cls = env->FindClass("com/example/sd/MainActivity");
if(cls !=0)
{
mid = env->GetStaticMethodID(cls, "getFilePath", "()V");
if(mid !=0)
{
env->CallStaticVoidMethod(cls, mid);
}
CCLOG("mid==========%d",mid);
}
else CCLOG("FindClass(MainActivity)========ERROR");
jvm->DestroyJavaVM();
}
FreeLibrary(jvmDll);
}