Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116749
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-31 11:07
个人简介

弃我去者,昨日之日不可留; 乱我心者,今日之日多烦忧。

文章分类

分类: Java

2014-11-14 11:04:15

用Invocation API在C/C++代码中访问Java代码

测试用例由两部分组成,InvocationApiTest.java 和invocationApi.c,在c代码中访问Java代码的main函数。

编写Java代码:
点击(此处)折叠或打开
  1. public class InvocationApiTest
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         System.out.println(args[0]);
  6.     }
  7. }
编译InvocationApiTest.java:
javac InvocationApiTest.java

编写c程序代码
invocationApi.c:

点击(此处)折叠或打开

  1. #include <jni.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.     JNIEnv *env;
  6.     JavaVM *vm;
  7.     JavaVMInitArgs vm_args;
  8.     JavaVMOption options[1];
  9.     jint res;
  10.     jclass cls;
  11.     jmethodID mid;
  12.     jstring jstr;
  13.     jclass stringClass;
  14.     jobjectArray args;
  15.     
  16.     //1、生成Java虚拟机选项
  17.     options[0].optionString = "-Djava.class.path=.";
  18.     vm_args.version = 0x00010002;//JNI_VERSION_1_6;//
  19.     vm_args.options = options;
  20.     vm_args.nOptions = 1;
  21.     vm_args.ignoreUnrecognized = JNI_TRUE;

  22.     //2、生成Java虚拟机
  23.     res = JNI_CreateJavaVM(&vm, (void**)&env, &vm_args);
  24.     if (res < 0) {

  25.          fprintf(stderr, "Can't create Java VM\n");

  26.          exit(1);

  27.      }
  28.     //3、查找并加载类
  29.     cls = (*env)->FindClass(env, "InvocationApiTest");

  30.     //4、获取main()方法的ID
  31.     mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
  32.     
  33.     //5、生成字符串对象,用作main()方法的参量
  34.     jstr = (*env)->NewStringUTF(env, "Hello Invocation API!!");
  35.     stringClass = (*env)->FindClass(env, "java/lang/String");
  36.     args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
  37.     
  38.     //6、调用main()方法
  39.     (*env)->CallStaticVoidMethod(env, cls, mid, args);
  40.     
  41.     //7、销毁Java虚拟机
  42.     (*vm)->DestroyJavaVM(vm);

  43.     return 0;
  44. }
编译c程序:
cl -I "D:\Program Files\Java\jdk1.8.0_25\include" -I "D:\Program Files\Java\jdk1.8.0_25\include\win32" InvocationApi.c -link "D:\Program Files\Java\jdk1.8.0_25\lib\jvm.lib"

执行invocationApi.exe输出
Hello Invocation API!!

注意事项:
最后还需要在环境变量PATH中添加jvm.dll动态链接库的路径%JAVA_HOME%jre\bin\client,不然的话创建Java虚拟机会失败。
还可以把生成的invocationApi.exe和InvocationApiTest.class拷贝到jvm.dll所在的目录中,这样也可以执行。



阅读(1553) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~