用invocation api在c/c 代码中访问java代码-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 114816
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-31 11:07
个人简介

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

文章分类

(83)

  • (5)
  • (65)
  • (3)
  • (10)
  • (0)
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: 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所在的目录中,这样也可以执行。



阅读(1424) | 评论(0) | 转发(0) |
0

上一篇:c程序控制java端代码

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图