JNI:C++调用java

  编程人员有时会用到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,如果你是按步骤来的,相信不会有问题的。
 
 
 
 
在上一篇文章中,简单的介绍了JNI的使用。上一篇主要是讲 C++调用java的静态方法的,这一篇来介绍C++调用java的普通方法的,关于JDK的环境变量设置请参考上一篇文章,这里不再赘述。只把C++代码和java代码发上来供大家参考。
Java:
package test;

public class Sample
{
    public Sample()
    {
        //empty construct function
    }

    public int intMethod(int n)
    {
        return n*n;
    }

    public boolean booleanMethod(boolean bool)
    {
          return !bool;
    }
}
C++:
#include<jni.h>
#include<string.h>

int main(int argc, char* argv[])
{
      JavaVMOption options[1];
      JNIEnv *env;
      JavaVM *jvm;
      JavaVMInitArgs vm_args;
      int status;
      jclass cls;
      jobject j_object;
      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);

      //检查虚拟机是否创建成功
      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;
      }

      //获得构造函数的jmethodID
      jmethodID MainID = env->GetMethodID(cls,"<init>","()V");
      if(MainID == 0)
      {
          printf("Can not get construct function id\n");
          return -1;
      }

      //创建构造函数的对象
      j_object = env->NewObject(cls,MainID);

      //获得方法的jmethodID
      mid = env->GetMethodID(cls,"intMethod","(I)I");
      if(mid != 0)
     
          //调用函数
          square = (jint)env->CallObjectMethod(j_object,mid,5);
          printf("Result of intMethod: %d\n", square);
      }

      mid = env->GetMethodID(cls,"booleanMethod","(Z)Z");
      if(mid != 0)
      {
          not = (jboolean)env->CallObjectMethod(j_object,mid,1);
          printf("Result of booleanMethod: %d\n", not);
      }

      //销毁虚拟机
      jvm->DestroyJavaVM();
      return 0;    
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值