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.   

    己UP一下先。
    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,也不好使,为何?
      

  2.   

    这个问题,自己解决了。把Demo.class放到DemoJNI目录下,和Debug目录在同一目录,即可。