JNI:C++调用java之一

来自:http://blog.sina.com.cn/s/blog_60c069a40100hddq.html

 

编程人员有时会用到JNI,网上关于这方面的文章也很多,可是大多说的不够详细,或者就是转来转去,让我们这些菜鸟看了也自己弄不出来,不是找不到这个,就是找不到那个,今天闲来无事,自己做了一个例子,希望对菜鸟有些帮助,本例是C++调用java的静态方法,以后有时间再写一篇调用普通方法的,本例java文件是在netbeans下编写的,cpp文件是在VS2003下编写的。不再赘述,下面是步骤。
    1.当然是要安装好JDK了,我用的是1.6的,就以1.6为例了。
    2.设置环境变量,将“C:\Program Files\Java\jdk1.6.0_07\jre\bin\client;”和“C:\Program               Files\Java\jdk1.6.0_07\jre\bin\server”两项加入到path里。
    3.新建java项目test,在项目test里新建个test的包,新建文件sample.java,其内容如下:
       package  test;
       public class Sample
       {
           public static int intMethod(int n)
           {
               return n*n;
           }
    
           public static boolean booleanMethod(boolean bool)
           {
               return !bool;
           }
       }
       将其打成包test.jar。
    4.新建C++项目main(Win32控制台项目),新建cpp文件main.cpp,其内容如下:
       #include <jni.h>
       #include<string.h>
 
       int main()
       {
           JavaVMOption options[1];
           JNIEnv *env;
           JavaVM *jvm;
           JavaVMInitArgs vm_args;
           int status;
           jclass cls;
           jmethodID mid;
           jint square;
           jboolean not;
 
           options[0].optionString = "-Djava.class.path=./test.jar";
           memset(&vm_args, 0, sizeof(vm_args)); 
           vm_args.version = JNI_VERSION_1_2;
           vm_args.nOptions = 1;
           vm_args.options = options;
           status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
 
           //如果创建虚拟机失败,则返回-1
           if(status == JNI_ERR)
           {
               printf("Can not create JavaVM!\n");
               return -1;
           }
 
           //寻找类
           cls = env->FindClass("test/Sample");
           if(cls == 0)
           {
               printf("Can not find class!\n");
               return -1;
           }
 
           //获得静态方法ID
           mid = env->GetStaticMethodID(cls, "intMethod", "(I)I");
           if(mid !=0)
           { 
               //调用静态方法
               square = env->CallStaticIntMethod(cls, mid, 5);
               printf("Result of intMethod: %d\n", square);
           }
 
           mid = env->GetStaticMethodID(cls, "booleanMethod", "(Z)Z");
           if(mid !=0)
           {
               not = env->CallStaticBooleanMethod(cls, mid, 1);
               printf("Result of booleanMethod: %d\n", not);
           }
 
           //销毁虚拟机
           jvm->DestroyJavaVM();
           return 0;
       }
    5.将test.jar复制到main项目里(debug外面)。
    6.右键main项目属性,定位到C/C++的常规选项上,在附加包含目录中加入以下两项(依安装路径而定)
       C:\Program Files\Java\jdk1.6.0_07\include
       C:\Program Files\Java\jdk1.6.0_07\include\win32
       如图1和图2:
       JNI:C++调用java之一

 

JNI:C++调用java之一

    7.将项目定位到链接器—常规项上,在附加库目录里加入C:\Program Files\Java\jdk1.6.0_07\lib
      如下图
JNI:C++调用java之一
JNI:C++调用java之一


    8.将项目定位到链接器——输入项上,在附加依赖项里,加入jvm.lib,如下图
       JNI:C++调用java之一

 

     至此,虚拟机的配置就算完成了。运行main.cpp,如果你是按步骤来的,相信不会有问题的。
posted @ 2014-05-27 11:13  悟寰轩-叶秋  阅读(560)  评论(0)    收藏  举报