SlideShare a Scribd company logo
1 of 3
Download to read offline
JNI 攻略之十一――启动虚拟机调用 java 类

                                                                        江苏 无锡 缪小东


一、一个简单的 java 程序

    下面是一个简单的 java 程序!主要是供虚拟机直接调用的!我们可以编写任意的 java 程序,然后
在 c 中调用虚拟机执行它!通常我们会有此场景:某些本地系统可能不支持多线程,但你对 java 的多线
程又比较精通,同时对 c 还是比较了解,此时我们就可以在 c 中调用虚拟机,执行改线程程序!更一般
的:以前有一个用 c 写的服务器程序,它可以介绍客户的申请,当然这种申请在某一个时刻肯定是很多
很多的,因此我们就想让这些申请交由 java 的线程完成!此时就可以使用 c 调用虚拟机执行线程操作!
对用户隐藏了内部调用虚拟机执行线程的细节!
    //示例程序 Prog.java
    public class Prog {
          public static void main(String[] args) {
                System.out.println("Hello World " + args[0]);
          }
    }




二、调用虚拟机执行 java 程序的代码

  下面是启动虚拟机执行 java 程序的过程。(在此之前请先阅读上面一篇)
  /* invoke&exec.c */
  #include <stdio.h>
  #include <jni.h>

  int main() {
       int res;
       JavaVM *jvm;
       JNIEnv *env;
       JavaVMInitArgs vm_args;
       JavaVMOption options[3];                       //以上是启动虚拟机的一些参数

       jclass cls , strcls;                      //将要被虚拟机执行的类和创建的 String 类

       jmethodID mid ;                           //类的方法标识符
       jstring jstr ;                            //输入参数
       jobjectArray args ;                       //主函数输入参数

        vm_args.version=JNI_VERSION_1_2;              //这个字段必须设置为该值

        /*设置初始化参数*/
        options[0].optionString = "-Djava.compiler=NONE";
                                                      1
options[1].optionString = "-Djava.class.path=.";
          options[2].optionString = "-verbose:jni";        //用于跟踪运行时的信息
          /*版本号设置不能漏*/
          vm_args.version = JNI_VERSION_1_2;
          vm_args.nOptions = 3;
          vm_args.options = options;
          vm_args.ignoreUnrecognized = JNI_TRUE;
          res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
          if (res < 0) {
            fprintf(stderr, "Can't create Java VMn");
            //exit(1);
          }

         //建立一个类及其方法,调用其方法的过程。和前面操作 java 的方法完全一样哦!
         cls = (*env)->FindClass(env, "Prog");
         if (cls == NULL) {          goto destroy; }
         mid = (*env)->GetStaticMethodID(env, cls, "main","([Ljava/lang/String;)V");
         if (mid == NULL) {          goto destroy; }
         jstr = (*env)->NewStringUTF(env, " This Method is called from C!");
         if (jstr == NULL) {         goto destroy; }
         strcls = (*env)->FindClass(env, "java/lang/String");
         args = (*env)->NewObjectArray(env, 1, strcls, jstr);
         if (args == NULL) {         goto destroy; }
         (*env)->CallStaticVoidMethod(env, cls, mid, args);
    destroy:
         if ((*env)->ExceptionOccurred(env)) {
                 (*env)->ExceptionDescribe(env);
         }
         (*jvm)->DestroyJavaVM(jvm);
         fprintf(stdout, "Java VM destory.n");
    }




三、执行结果

    以下是执行结果的主要部分!
[Dynamic-linking native method java.lang.Float.intBitsToFloat ... JNI]
[Dynamic-linking native method java.lang.Double.longBitsToDouble ... JNI]
[Dynamic-linking native method java.lang.Float.floatToIntBits ... JNI]
[Dynamic-linking native method java.lang.Double.doubleToLongBits ... JNI]
[Dynamic-linking native method java.lang.Object.registerNatives ... JNI]
[Registering JNI native method java.lang.Object.hashCode]
[Registering JNI native method java.lang.Object.wait]
    ……
[Registering JNI native method sun.misc.Unsafe.getShortVolatile]
[Registering JNI native method sun.misc.Unsafe.staticFieldOffset]
                                                    2
……
[Dynamic-linking native method java.io.FileOutputStream.writeBytes ... JNI]

Hello World This Method is called from C!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Java VM destory.

    后面 3 个分别是 C 中的输出、main 方法的输入――调用 aaa XXXX > 11.txt 和 c 中最后的输出!
    执行此 exe 程序,必须将 Prog.class 放到同一个目录中!



更多精彩请关注:
      http://blog.163.com/miaoxiaodong78/




                                                     3

More Related Content

What's hot

Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)wang hongjiang
 
改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法crasysatan
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析wang hongjiang
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closureswang hongjiang
 
4, controlling execution
4, controlling execution4, controlling execution
4, controlling executionted-xu
 
深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)wang hongjiang
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断ivannotes
 
Ecmascript
EcmascriptEcmascript
Ecmascriptjay li
 
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当裕波 周
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 

What's hot (20)

Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
 
改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法
 
Node way
Node wayNode way
Node way
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
 
4, controlling execution
4, controlling execution4, controlling execution
4, controlling execution
 
深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)
 
Vim
VimVim
Vim
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
 
Closure
ClosureClosure
Closure
 
Ecmascript
EcmascriptEcmascript
Ecmascript
 
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
Java script closures
Java script closuresJava script closures
Java script closures
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 

Viewers also liked

Viewers also liked (20)

Debug JNI code with ndk-gdb and eclipse GUI
Debug JNI code with ndk-gdb and eclipse GUIDebug JNI code with ndk-gdb and eclipse GUI
Debug JNI code with ndk-gdb and eclipse GUI
 
JNI Capabilities Presentation
JNI Capabilities PresentationJNI Capabilities Presentation
JNI Capabilities Presentation
 
Jni – java native interface
Jni – java native interfaceJni – java native interface
Jni – java native interface
 
Let's talk about jni
Let's talk about jniLet's talk about jni
Let's talk about jni
 
JNI
JNIJNI
JNI
 
Jni
JniJni
Jni
 
Face Tattoo Source Article
Face Tattoo Source ArticleFace Tattoo Source Article
Face Tattoo Source Article
 
Betekenis Van Kleuren
Betekenis Van KleurenBetekenis Van Kleuren
Betekenis Van Kleuren
 
Linux命令学习
Linux命令学习Linux命令学习
Linux命令学习
 
RicoLiveGrid
RicoLiveGridRicoLiveGrid
RicoLiveGrid
 
Dojo1.0_Tutorials
Dojo1.0_TutorialsDojo1.0_Tutorials
Dojo1.0_Tutorials
 
SWtrngGB
SWtrngGBSWtrngGB
SWtrngGB
 
The Alps Scenery And Songs
The Alps Scenery And SongsThe Alps Scenery And Songs
The Alps Scenery And Songs
 
drmaatutggf12
drmaatutggf12drmaatutggf12
drmaatutggf12
 
Lab_2_2009
Lab_2_2009Lab_2_2009
Lab_2_2009
 
Second Magazine Analysis
Second Magazine AnalysisSecond Magazine Analysis
Second Magazine Analysis
 
Blossoming Together Dr. Shriniwas Kashalikar
Blossoming Together Dr. Shriniwas KashalikarBlossoming Together Dr. Shriniwas Kashalikar
Blossoming Together Dr. Shriniwas Kashalikar
 
Icicles
IciclesIcicles
Icicles
 
cdf31prm
cdf31prmcdf31prm
cdf31prm
 
XSD%20and%20jCAM%20tutorial
XSD%20and%20jCAM%20tutorialXSD%20and%20jCAM%20tutorial
XSD%20and%20jCAM%20tutorial
 

Similar to Jni攻略之十一――启动虚拟机调用Java类

Jni攻略之十――操作Java虚拟机
Jni攻略之十――操作Java虚拟机Jni攻略之十――操作Java虚拟机
Jni攻略之十――操作Java虚拟机yiditushe
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013Hazem Saleh
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架wtxidian
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架fangdeng
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Kris Mok
 
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 JavaIKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java建興 王
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出wang hongjiang
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会Zhi Zhong
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1Zianed Hou
 
Java 1(Java概述)
Java 1(Java概述)Java 1(Java概述)
Java 1(Java概述)xzdbd
 

Similar to Jni攻略之十一――启动虚拟机调用Java类 (20)

Jni攻略之十――操作Java虚拟机
Jni攻略之十――操作Java虚拟机Jni攻略之十――操作Java虚拟机
Jni攻略之十――操作Java虚拟机
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
Sun java
Sun javaSun java
Sun java
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
 
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 JavaIKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会
 
nodejs开发web站点
nodejs开发web站点nodejs开发web站点
nodejs开发web站点
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1
 
Java 1(Java概述)
Java 1(Java概述)Java 1(Java概述)
Java 1(Java概述)
 

More from yiditushe

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要yiditushe
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册yiditushe
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2yiditushe
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1yiditushe
 
性能测试技术
性能测试技术性能测试技术
性能测试技术yiditushe
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术yiditushe
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试yiditushe
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训yiditushe
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程yiditushe
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Luceneyiditushe
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍yiditushe
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Actionyiditushe
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1yiditushe
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demoyiditushe
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析yiditushe
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则yiditushe
 
10 团队开发
10  团队开发10  团队开发
10 团队开发yiditushe
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模yiditushe
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模yiditushe
 

More from yiditushe (20)

Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
J Bpm4 1中文用户手册
J Bpm4 1中文用户手册J Bpm4 1中文用户手册
J Bpm4 1中文用户手册
 
性能测试实践2
性能测试实践2性能测试实践2
性能测试实践2
 
性能测试实践1
性能测试实践1性能测试实践1
性能测试实践1
 
性能测试技术
性能测试技术性能测试技术
性能测试技术
 
Load runner测试技术
Load runner测试技术Load runner测试技术
Load runner测试技术
 
J2 ee性能测试
J2 ee性能测试J2 ee性能测试
J2 ee性能测试
 
面向对象的Js培训
面向对象的Js培训面向对象的Js培训
面向对象的Js培训
 
Flex3中文教程
Flex3中文教程Flex3中文教程
Flex3中文教程
 
开放源代码的全文检索Lucene
开放源代码的全文检索Lucene开放源代码的全文检索Lucene
开放源代码的全文检索Lucene
 
基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍基于分词索引的全文检索技术介绍
基于分词索引的全文检索技术介绍
 
Lucene In Action
Lucene In ActionLucene In Action
Lucene In Action
 
Lucene2 4学习笔记1
Lucene2 4学习笔记1Lucene2 4学习笔记1
Lucene2 4学习笔记1
 
Lucene2 4 Demo
Lucene2 4 DemoLucene2 4 Demo
Lucene2 4 Demo
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析Lucene 3[1] 0 原理与代码分析
Lucene 3[1] 0 原理与代码分析
 
7 面向对象设计原则
7 面向对象设计原则7 面向对象设计原则
7 面向对象设计原则
 
10 团队开发
10  团队开发10  团队开发
10 团队开发
 
9 对象持久化与数据建模
9  对象持久化与数据建模9  对象持久化与数据建模
9 对象持久化与数据建模
 
8 Uml构架建模
8  Uml构架建模8  Uml构架建模
8 Uml构架建模
 

Jni攻略之十一――启动虚拟机调用Java类

  • 1. JNI 攻略之十一――启动虚拟机调用 java 类 江苏 无锡 缪小东 一、一个简单的 java 程序 下面是一个简单的 java 程序!主要是供虚拟机直接调用的!我们可以编写任意的 java 程序,然后 在 c 中调用虚拟机执行它!通常我们会有此场景:某些本地系统可能不支持多线程,但你对 java 的多线 程又比较精通,同时对 c 还是比较了解,此时我们就可以在 c 中调用虚拟机,执行改线程程序!更一般 的:以前有一个用 c 写的服务器程序,它可以介绍客户的申请,当然这种申请在某一个时刻肯定是很多 很多的,因此我们就想让这些申请交由 java 的线程完成!此时就可以使用 c 调用虚拟机执行线程操作! 对用户隐藏了内部调用虚拟机执行线程的细节! //示例程序 Prog.java public class Prog { public static void main(String[] args) { System.out.println("Hello World " + args[0]); } } 二、调用虚拟机执行 java 程序的代码 下面是启动虚拟机执行 java 程序的过程。(在此之前请先阅读上面一篇) /* invoke&exec.c */ #include <stdio.h> #include <jni.h> int main() { int res; JavaVM *jvm; JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption options[3]; //以上是启动虚拟机的一些参数 jclass cls , strcls; //将要被虚拟机执行的类和创建的 String 类 jmethodID mid ; //类的方法标识符 jstring jstr ; //输入参数 jobjectArray args ; //主函数输入参数 vm_args.version=JNI_VERSION_1_2; //这个字段必须设置为该值 /*设置初始化参数*/ options[0].optionString = "-Djava.compiler=NONE"; 1
  • 2. options[1].optionString = "-Djava.class.path=."; options[2].optionString = "-verbose:jni"; //用于跟踪运行时的信息 /*版本号设置不能漏*/ vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 3; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res < 0) { fprintf(stderr, "Can't create Java VMn"); //exit(1); } //建立一个类及其方法,调用其方法的过程。和前面操作 java 的方法完全一样哦! cls = (*env)->FindClass(env, "Prog"); if (cls == NULL) { goto destroy; } mid = (*env)->GetStaticMethodID(env, cls, "main","([Ljava/lang/String;)V"); if (mid == NULL) { goto destroy; } jstr = (*env)->NewStringUTF(env, " This Method is called from C!"); if (jstr == NULL) { goto destroy; } strcls = (*env)->FindClass(env, "java/lang/String"); args = (*env)->NewObjectArray(env, 1, strcls, jstr); if (args == NULL) { goto destroy; } (*env)->CallStaticVoidMethod(env, cls, mid, args); destroy: if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionDescribe(env); } (*jvm)->DestroyJavaVM(jvm); fprintf(stdout, "Java VM destory.n"); } 三、执行结果 以下是执行结果的主要部分! [Dynamic-linking native method java.lang.Float.intBitsToFloat ... JNI] [Dynamic-linking native method java.lang.Double.longBitsToDouble ... JNI] [Dynamic-linking native method java.lang.Float.floatToIntBits ... JNI] [Dynamic-linking native method java.lang.Double.doubleToLongBits ... JNI] [Dynamic-linking native method java.lang.Object.registerNatives ... JNI] [Registering JNI native method java.lang.Object.hashCode] [Registering JNI native method java.lang.Object.wait] …… [Registering JNI native method sun.misc.Unsafe.getShortVolatile] [Registering JNI native method sun.misc.Unsafe.staticFieldOffset] 2
  • 3. …… [Dynamic-linking native method java.io.FileOutputStream.writeBytes ... JNI] Hello World This Method is called from C! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Java VM destory. 后面 3 个分别是 C 中的输出、main 方法的输入――调用 aaa XXXX > 11.txt 和 c 中最后的输出! 执行此 exe 程序,必须将 Prog.class 放到同一个目录中! 更多精彩请关注: http://blog.163.com/miaoxiaodong78/ 3