最近在学习C++调用java类的流程,在按照网上示例做的过程中遇到了一些小问题,今天才得以彻底解决
按照网上的例子做完后发现程序运行总是失败,原因在于自定义的类JVM无法找到,例子只说让自己编写自定义的类,但并没有说生成的类应该放在什么地方才可以被JVM正确的找到,通常根据需要我们的类是房子特定的目录下的,而且放在jvm路径下也是不安全的,所以在网上的大多数例子都缺少一步,设置自定义类的路径
int main(){
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version=JNI_VERSION_1_4;
/*设置初始化参数*/
options[0].optionString = "-Djava.compiler=NONE";
/*类路径,相对或绝对,可设多个,分号隔开*/
options[1].optionString = "-Djava.class.path=C:\\java\\RTMP\\bin;";
options[2].optionString = " -Djava.library.path=C:\\java\\RTMP\\lib";
options[3].optionString ="-verbose:jni";
vm_args.nOptions =3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
//------------------------------加载jvm:
HINSTANCE jvmDll = LoadLibrary("D:\\Program Files\\Java\\jre1.6.0_07\\bin\\client\\jvm.dll");
if (jvmDll == NULL) printf("加载JVM动态库错误。%l", ::GetLastError());
//查找JNI_CreateJavaVM过程。
JNICREATEPROC jvmCreateProc = (JNICREATEPROC)GetProcAddress(jvmDll, "JNI_CreateJavaVM");
if (jvmCreateProc == NULL)
{
FreeLibrary(jvmDll);
printf("查找JNI_CreateJavaVM过程错误。%l", ::GetLastError());
}
//创建JVM:
int res = (jvmCreateProc)(&jvm, (void **)&env, &vm_args);
if (res < 0 || jvm == NULL || env == NULL)
{
FreeLibrary(jvmDll);
printf( "创建JVM发生错误。");
}
//---------------------------------------------------------------------------------
jclass jcl = env->FindClass("RTMPHandshake");//加载启动类
if (env->ExceptionCheck() == JNI_TRUE || jcl == NULL)
{
FreeLibrary(jvmDll);
printf("加载启动类失败。");
}
jmethodID mid = env->GetMethodID(jcl,"generateResponse","([Ljava/lang/String;)V");//此处的参数意义见注解1
if (env->ExceptionCheck() == JNI_TRUE || mid == NULL)
{
FreeLibrary(jvmDll);
printf("查找启动方法失败。");
}
//-------------------------调用方法:
env-> CallObjectMethod( jcl, mid); //第3,4…参数就是被调方法的参数
FreeLibrary(jvmDll);
}
注意:
/*自定义类、库路径,相对或绝对,可设多个,分号隔开*/
options[1].optionString = "-Djava.class.path=C:\\java\\RTMP\\bin;";
options[2].optionString = " -Djava.library.path=C:\\java\\RTMP\\lib";
现在总算调试通过了,真高兴
分享到:
评论