1、JDK1.4的JNI接口变动了,不能兼容以前的,那以前写的JNI代码,岂不是不能在JRE1.4上运行?
比方说:
JNIEnv *pEnv;
JDK1.2: jclass cls = (*pEnv)->FindClass( pEnv,"HelloWorld");
JDK1.4: jclass cls = pEnv->FindClass("HelloWorld");2、我用JNI实现C++调用JAVA,不知道为什么虚拟机老是加载失败?请高手帮我看看啊!
我用VC++6.0编译test.cpp后,在debug目录下产生test.exe,然后我把java编译后的HelloWorld.class拷贝到debug目录下,然后把..\j2sdk1.4.2_08\jre\bin\client下的jvm.dll也拷贝到debug目录下,在vc++下debug。加载虚拟机失败,请问我的做法错在哪里?
=============JAVA===================================
HelloWorld.java类如下:import java.lang.*;
public class HelloWorld {
public static int intMethod(int n) {
return n*n;
}
}
===============================C++=================================
Test.cpp如下:#include "stdafx.h"
#include <jni.h>
int main(int argc, char* argv[])
{
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
options[0].optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.options = options; //我在下面这个地方就返回错误,加载虚拟机失败,为什么?
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status != JNI_ERR)
{
cls = env->FindClass("HelloWorld");
if(cls !=0)
{
mid = env->GetStaticMethodID(cls, "intMethod", "(I)I");
if(mid !=0)
{
square = env->CallStaticIntMethod(cls, mid, 6);
printf("Result of intMethod: %d\n", square);
}
}
jvm->DestroyJavaVM();
}
return 0;}
1、我如果不拷贝jvm.dll到debug目录下,虚拟机加载成功(估计程序在环境变量的path目录下找到jvm.dll),但是cls = env->FindClass("HelloWorld")调用,cls为0;
2、我如果把vm_args.version = JNI_VERSION_1_2;改为vm_args.version = JNI_VERSION_1_4,也不好使,为何?