代码如下:
#include   <jni.h>   
#include   <stdlib.h>   
void main(int argc, char *argv[], char **envp) 
{
  JavaVMOption options[2];
  JavaVMInitArgs vm_args;
  JavaVM *jvm;
  JNIEnv *env;
  long result;
  jmethodID mid;
  jfieldID fid;
  jobject jobj;
  jclass cls;
  int asize;  options[0].optionString = ".";
  options[1].optionString = "-Djava.compiler=NONE";  vm_args.version = JNI_VERSION_1_2;
  vm_args.options = options;
  vm_args.nOptions = 2;
  vm_args.ignoreUnrecognized = JNI_FALSE;  result = JNI_CreateJavaVM(&jvm,(void **)&env, &vm_args);  if(result == JNI_ERR ) 
  {
printf("Error invoking the JVM");
exit (-1);
  }  cls = env->FindClass("ConnLDAP");  if( cls == NULL ) 
  {
printf("can't find class ConnLDAP\n");
exit (-1);
  }  env->ExceptionClear();  mid=env->GetMethodID(cls, "start", "()V");  env->CallStaticObjectMethod(cls, mid);
  jvm->DestroyJavaVM();  return;
}
现在用VC60调试,小弟有几个问题请教大侠:
1)为什么运行到JNI_CreateJavaVM出错?
2)我要调用的是同一目录下的ConnLDAP.java库中的start函数,是不是上面的写法?

解决方案 »

  1.   

    jdk版本是j2sdk1.4.2_09vm_args.version = JNI_VERSION_1_4; 这样写我也试过不行。
      

  2.   

    你好像缺了
        jvm = new JavaVM();
        env = new JNIEnv();另外,你要调用 ConnLDAP.java 的 start 函数,这样写虽然没错,但是运行的时候 ConnLDAP.java 是没用的,应该有 ConnLDAP.class,而且,在“当前目录下”不一定管用,应该在 classpath 的路径内。
      

  3.   

    加了:
        jvm = new JavaVM();
        env = new JNIEnv();
    还是不对,还是在JNI_CreateJavaVM出错?当前目录中有ConnLDAP.class的,classpath中也有。
      

  4.   

    另外,我在网上搜出来的例子好像都没有写
       jvm = new JavaVM();
        env = new JNIEnv();
    不知道实际上要不要?
      

  5.   

    hehe, 不好意思,又试验了一下,的确不需要 new JavaVM(),我只是看了一下原来写过的程序,没实际做,结果误导你了,抱歉!至于你遇到的问题,我也帮你找到原因了(至少在我这里也能出现同样的现象了)。是这样的,JNI 的程序运行起来后,不止需要一个 jvm.dll,而是需要 JRE 里面几乎全部的文件(虽然你从 jvm.dll 本身看不到对其它 DLL 的依赖),而且目录布局要保持 JRE 原来的样子。我估计你是把 jvm.dll 拷贝到自己程序的文件夹里去了,这样是不行的,要把你的 .exe 拷贝到 jvm.dll 所在的文件夹才可以。如果你觉得把自己的程序拷贝到 JRE 文件夹里很难看,索性采用 LoadLibrary() 和 GetProcAddress() 的方式对 jvm.dll 进行动态加载。