通过JNI实现Java和C++的相互调用
- 格式:doc
- 大小:54.00 KB
- 文档页数:7
java调用c方法Java调用C方法在Java开发中,有时候会需要调用C语言编写的库或者方法来提供底层的功能支持或者优化性能。
本文将详细介绍Java调用C方法的各种方法。
方法一:JNIJNI(Java Native Interface)是一种允许Java代码调用本地方法的标准机制。
下面是使用JNI调用C方法的步骤:1.编写C代码文件:首先需要编写C代码,包含要调用的方法的实现。
可以将C代码编写到独立的文件中,如``。
2.生成头文件:使用Java提供的javah工具生成C头文件。
在终端中执行以下命令:javah -jni这将生成com_example_文件,其中``是包含本地方法定义的Java类。
3.实现本地方法:在C代码文件中实现头文件中定义的本地方法。
4.编译本地库:使用C编译器编译C代码文件并生成本地库文件(.so文件或.dll文件)。
在终端中执行以下命令:gcc -shared -o -I${JAVA_HOME}/include -I ${JAVA_HOME}/include/linux这将生成文件,其中是C代码文件。
5.加载本地库:在Java类中使用("native")加载本地库。
6.声明本地方法:在Java类中声明使用native关键字修饰的本地方法。
7.调用本地方法:通过Java代码调用本地方法。
方法二:JNAJNA(Java Native Access)是一种简化了JNI复杂性的Java库,它提供了一种更简单的方式来调用本地方法。
下面是使用JNA调用C方法的步骤:1.引入JNA库:在Java项目中引入JNA库的依赖。
2.声明本地方法:在Java接口中声明要调用的本地方法。
3.加载本地库:使用()方法加载本地库文件。
4.调用本地方法:通过Java代码调用本地方法。
与JNI相比,JNA的使用更加简单,不需要编写繁琐的C代码和生成头文件。
在使用JNA时,需要注意本地方法的声明方式和加载本地库的方式。
示例实现:JNI接口之java掉C实现开发环境:vs2010,eclipse1、新建eclipse工程,代码如下(建议使用高版本jdk,本人使用jdk1.8):package ;publicclass MyJni {//使用JNI的关键字native,这个关键字决定我们哪些方法能在我们的C文件中使用,只需声明,不必实现publicnativevoid display();publicnativedouble sum(double x,double y);//这个是到时候调用我们写好的c文件,现在用不上,可以先注释掉// static {//System.out.println(System.getProperty("jav a.library.path"));//System.loadLibrary("jni04Dll");// }publicstaticvoid main(String[] args) { // TODO Auto-generated method stubSystem.out.println("heheda");//到时候测试用方法现在用不上,可以先注释掉//new MyJni().display();//System.out.println(new MyJni().sum(2.0, 3.0)); }}2、先把写好的类转成.class文件,进入工程目录src目录下,cmd打开dos窗口,执行如下命令:javac java2c/thinkit/cn/MyJni.java会在.java文件同级目录生成.class文件然后把.class文件转换成头文件,dos窗口执行如下命令:Javah .MyJni会在src目录下生成我们需要的头文件,名字为java2c_thinkit_cn_MyJni.h,后面会用到3、VS2010创建动态链接库,方法新建工程,选择win32项目,选择dll、空项目,如下图;4、导入所需要的头文件,需要jdk目录C:\Java\jdk1.8.0_77\include下面的jni.h文件以及目录C:\Java\jdk1.8.0_77\include\win32下jni_md.h文件,和上面生成的java2c_thinkit_cn_MyJni.h文件(java安装路径不要有空格)新建头文件和源文件,新建头文件,名字为jni04Dll.h,内容如下:方面名是参照生成的java2c_thinkit_cn_MyJni.h这个文件里的两个方法名字写的,这里做声明,在.cpp里进行实现;JNIEXPORT void JNICALL Java_java2c_thinkit_cn_MyJni_display(JNIEnv *env,jobjectobj); JNIEXPORT jdouble JNICALL Java_java2c_thinkit_cn_MyJni_sum(JNIEnv*env,jobjectobj,jdoublea,jdouble b);void MyName();新建源文件,名字为jni04Dll.cpp,内容如下:#include"jni.h"#include"jni_md.h"#include"java2c_thinkit_cn_MyJni.h"#include<stdio.h>#include"jni04Dll.h"JNIEXPORT void JNICALL Java_java2c_thinkit_cn_MyJni_display(JNIEnv *env,jobjectobj){ printf("hello world!");MyName();return;}JNIEXPORT jdouble JNICALL Java_java2c_thinkit_cn_MyJni_sum(JNIEnv*env,jobjectobj,jdoublea,jdouble b){return a+b;}void MyName(){printf("test is successful!\n");return;}右键工程->属性->c/c++->常规,添加java2c_thinkit_cn_MyJni.h所在路径;注意需要生成64位的动态链接库,否则java调用的话会报错:然后工程文件右键->生成,在项目目录x64/debug目录下,生成.dll和.lib文件。
示例实现:JNI接口之java掉C实现开发环境:vs2010,eclipse,linux641、新建java工程导出可执行jar包,命名为JNITest.jar;导出头文件,jni_test_Demo.h(javac/javah),查看签名javap–s –pjni.test.Demo package jni.test;import java.util.Date;publicclass Demo {public String name = "test";publicstatic String sayHello(String name){ return"hello, " + name + "!\n";}public StringsayHello(){return"hello, xiaosujie" + "!\n";}publicstaticvoid main(String[] args) { // TODO Auto-generated method stubDemo demo = new Demo();System.out.println((demo.sayHello()));}}签名信息如下:(注意分号必须带)public class jni.test.Demo {ng.String name;descriptor: Ljava/lang/String;publicjni.test.Demo();descriptor: ()Vpublic static ng.StringsayHello(ng.String);descriptor: (Ljava/lang/String;)Ljava/lang/String;ng.StringsayHello();descriptor: ()Ljava/lang/String;public static void main(ng.String[]);descriptor: ([Ljava/lang/String;)V}2、新建C++工程导入jni.h和jni_md.h和我们java生成的头文件jni_test_Demo.h;导入java的依赖库C:\Java\jdk1.8.0_77\lib;C:\Java\jdk1.8.0_77\lib;C:\Java\jdk1.8.0_77\jre\bin\server添加jvm.dll参见JNI接口\JNI_C++\vs2010目录3、VS2010的cpp代码拷贝到linux服务器下,首先保证有java环境,其次把需要的jar包,我们生产的.h和写好的.cpp文件拷贝到linux目录下面,配置好如下环境变量/etc/profile JAVA_HOME=/usr/local/java/jdk1.7.0_45PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOMEexport PATHexport CLASSPATH#java运行需要的环境以及编译运行依赖的库export JRE_HOME=/usr/local/java/jdk1.7.0_45/jreexportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JRE_HOME/lib/amd64:$JRE_HOME/lib/amd64/serv es然后即可执行,参见JNI接口\JNI_C++\Linux4、。
【黑马程序员】jni之java调用cjava调用C步骤第一步,写java代码,,写一个natvie方法public native String getServerInfo(String path);第二步。
创建jni目录,在目录中创建test.c文件,同时将jni.h文件放入jni目录写c代码,注意方法名,并且引入jni.h#include <jni.h>#include <stdio.h>jstring Java_com_example_untitled_MyActivity_getServerInfo(JNIEnv* env, jobject thiz, jstring path) {写方法。
}注意:方法名的写法如下Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)这里生成方法名也可以通过ndk来实现的分为2步* 通过dos命令使用javac -d . Test.java 命令编译带有native方法的.java文件,这样就会在当前目录中生成一个class文件会生成com/b3a4a/jnitest/Test.class* 通过javah命令来生成例如javah com.b3a4a.jnitest.Test,会生成.h的头文件生成com_b3a4a_jnitest_T est.h 文件,方法名就在.h头文件中JNIEXPORT jstring JNICALL Java_com_b3a4a_jnitest_T est_getServerInfo (JNIEnv *, jobject);第三步,在jni目录中创建文件,andorid.mkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := testLOCAL_SRC_FILES := test.cLOCAL_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lloginclude $(BUILD_SHARED_LIBRARY)第四步,进入命令行,进入应用程序的包的目录,执行ndk-build命令,创建Application.mk,自己填写需要的处理器型号,生成不同的so文件APP_ABI := armeabi armeabi-v7a x86第五步,将生成的libtest.so 放入lib/armeabi目录(目录不需要自己建)第六步,java代码里面,把动态链接库加载到jvm虚拟机static{System.loadLibrary("库文件名称不带前缀,后缀名");}第7步,java中直接调用native方法JNI开发的常见错误1. 写错了load的libraryng.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. Android.mk文件编写错误/jni/Android.mk:4: *** missing separator. Stop.3. LOCAL_MODULE配置不能有扩展名//jni/Android.mk:hello.so: LOCAL_MODULE_FILENAME must not contain a file extension4. c或者c++的源文件名称配置错误objs/hello/helo.o'. Stop.5. 如果使用了错误的cpu平台ng.UnsatisfiedLinkError: Couldn't load hello: findLibrary returned null添加多cpu平台的支持APP_ABI := armeabi armeabi-v7a x866. c语言方法名称错误,导致java代码无法寻找到c代码Caused by: ng.UnsatisfiedLinkError: Native method not found: com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;7. 应用程序闪退06-25 07:31:46.698: I/dalvikvm(1871): #00 pc 0008ee6d /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #01 pc 000738ca /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #02 pc 000739f4 /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #03 pc 00038f5b /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #04 pc0003bdbd /system/lib/libdvm.so 要么就是c代码有逻辑错误要么编码问题,中文或者空格路径。
NDKJNI中Java和CC++互相传递数组NDK/JNI 中Java和C/C++互相传递数组Java 和 C/C++通过Jni这个中间件,可以实现相互之间的数组传递;我这⾥提供⼏种⽅式;供参考;第⼀种:Java通过JNI传递给C/C++,经过处理后,再复制到Java数组并返回;Java的本地⽅法定义:public native int[] arrEncode(int[] arr);C代码的实现:#include <jni.h>JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode(JNIEnv *env, jobject obj, jintArray javaArr){//获取Java数组长度int lenght = (*env)->GetArrayLength(env,javaArr);//根据Java数组创建C数组,也就是把Java数组转换成C数组// jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);//把数组元素值加10处理int i;for(i =0 ; i<lenght;i++){*(arrp+i) +=10;}//将C数组种的元素拷贝到Java数组中(*env)->SetIntArrayRegion(env,javaArr,0,lenght,arrp);return javaArr;}第⼆种⽅式:在C中直接操作元素,然后把C数组复制到Java数组中,并更新Java数组;Java声明的本地⽅法public native void arrEncode(int[] arr);C代码实现#include <jni.h>JNIEXPORT void JNICALL Java_com_example_arrtoc_MainActivity_arrEncode(JNIEnv *env, jobject obj, jintArray javaArr){//获取Java数组长度int lenght = (*env)->GetArrayLength(env,javaArr);//根据Java数组创建C数组,也就是把Java数组转换成C数组// jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);//把数组元素值加10处理int i;for(i =0 ; i<lenght;i++){*(arrp+i) +=10;}//将C数组种的元素拷贝到Java数组中(*env)->SetIntArrayRegion(env,javaArr,0,lenght,arrp);}第三种:在C代码中新建Java数组,然后把C中数组的元素复制到Java数组中在返回给Java;Java定义的本地⽅法:public native int[] arrEncode(int[] arr);C代码实现:#include <jni.h>JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode (JNIEnv *env, jobject obj, jintArray javaArr){//获取Java数组长度int lenght = (*env)->GetArrayLength(env,javaArr);//根据Java数组创建C数组,也就是把Java数组转换成C数组// jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);//新建⼀个Java数组jintArray newArr = (*env)->NewIntArray(env,lenght);//把数组元素值加10处理int i;for(i =0 ; i<lenght;i++){*(arrp+i) +=10;}//将C数组种的元素拷贝到Java数组中(*env)->SetIntArrayRegion(env,newArr,0,lenght,arrp);return newArr;}第四种:通过JNI种的ReleaseArrayElements⽅法实现:这个⽅法的最后⼀个参数是模式:。
JNI实现最简单的JAVA调⽤CC++代码JNI,是Java Native Interface的简称,中⽂是“Java本地调⽤”。
通过这种技术可以做到以下两点:1. Java程序中的函数可以调⽤Native语⾔写的函数,Native⼀般指的是C/C++编写的函数。
2. Native程序中的函数可以调⽤Java层的函数,也就是说在C/C++程序中可以调⽤Java的函数。
本篇博客带给童鞋们以下内容,学习内容来⾃(传智播客),经由⼩巫总结整理:javah⼯具的⽤法按照C/C++头⽂件来编写C/C++源⽂件将C/C++源⽂件编译成动态连接库(DLL)在Java程序中引⼊动态连接库等知识JNI并不是什么特别神奇的东西,当初SUN推出它的⽬的是为了屏蔽不同操作系统平台的差异性,通过Java语⾔来调⽤Native语⾔的功能模块,避免重复制作车轮,最主要是这两个⽬的。
最简单的Java调⽤C/C++代码,有以下步骤,童鞋们最好详细阅读,避免出现相应的错误:⾸先在Java类中声明⼀个native的⽅法使⽤Javah命令⽣成native⽅法的声明的C/C++头⽂件按照⽣成的C/C++头⽂件来编写C/C++源⽂件将C/C++源⽂件编译成动态链接库(DLL)将DLL⽂件加⼊到PATH环境变量下Java类中加载DLL,然后调⽤声明⽅法我们现在⼀步⼀步把整个流程熟悉⼀遍,在Eclipse中创建⼀个Java项⽬:笔者创建了⼀个命为:TestNativeCode的项⽬,新建包名为com.wwj.nativecode,新建类为TestNativeCode接着在TestNativeCode类当中声明我们的本地⽅法:package com.wwj.nativecode;public class TestNativeCode {// 声明本地⽅法public native void sayHello();public static void main(String[] args) {// // 加载动态链接库// System.loadLibrary("nativeCode");// TestNativeCode nativeCode = new TestNativeCode();// nativeCode.sayHello();}}注释掉的代码后⾯很快会⽤到,暂时不⽤管。
JAVA是跨平台的语言,但在有些时候还是不得不调用本地代码,而且这些代码通常是C/C++写的,比如一某个手机的项目,需要JAVA程序在发送短信的时候和第三方的短信服务器连接。
短信接口是用C++写的。
需要用到JNI的主体部分。
1、在JAVA类中声明一个native方法:①新建JAVA工程testNative,包名packC,类名myNative,选择包含main方法②创建native类hello;2、使用Javah命令生成包含native方法定义的C/C++头文件:①打开cmd②执行:cd 刚刚建好的.class文件的文件夹bin的位置③执行:javah 包名.类名④生成的头文件如下所示:3、按照生成的C/C++头文件来写C/C++源文件创建工程,按照指示操作!头文件剪切到nativeCpro工程目录下向工程中添加头文件在工程下新建C++源文件,添加到工程nativeCpro中将头文件中指定函数复制进源文件中,并添加参数env和obj4、将C/C++源文件编译成动态链接库JDK下的jni.h拷贝到C程序工程下,如不,编译会出错写入程序头文件的尖括号< >改为双引号””,因为不是从系统目录加载头文件,而是从用户目录加载头文件编译出错,需要去JDK目录下找寻jni_md.h头文件!找到之后复制到工程下面!再进行编译就成功了!成功运行之后生成.dll文件!5、把.dll文件加入到path环境变量下动态链接库是可直接执行的二进制代码!将.dll文件目录添加到环境变量path中,注意与之前的内容用分号;隔开6、Java类中加载.dll,然后调用声明的native方法(eclipse)加载动态链接库,创建对象调用hello()函数,并且重启eclipse,因为要重新读取环境变量,这样运行才能保证成功!最后理想的运行结果!!!!!!由于现在主流机器都是64位的,JDK也是64位的,但是VC++ 6.0生成的.dll 文件却是32位的,如果要得到这个理想结果,请将JDK卸载并安装32位JDK!完工!使用JNI的弊端:1、使用了JNI之后,这个Java Application就不能跨平台了,如果要移植到别的平台上,native代码就要重新编写!2、Java是强类型语言,在写JNI时要倍加小心!3、不到万不得已,不要用JNI。
Java调用C/C++动态链接库DLL第一步利用JNI1.新建一个项目,创建一个类TestNative.java,然后点击run运行生成.class文件2.利用jdk自带的工具javah.exe 生成这个sayHello()这个native本地方法的头文件先进入eclipse下工程目录,进入bin目录,然后执行如下代码,编译出头文件这时候会出现一个自动生成的头文件用于我们编写C/C++代码3.利用Visual Studio2010 新建一个window控制台项目复制刚才利用javah生成的com_taobao_jni_TestNative.h到C++项目工程目录下,然后右击添加-->现有项将头文件引入到项目环境中4.添加JDK中系统头文件,如jni.h,这个头文件其实是在jdk目录下的include 目录下我们需要将jdk所需的所有头文件(包括win32下的所有头文件)复制到visual studio中VC 编译工具的include文件夹中,添加引入。
【所有头文件必须富之岛include的根目录下】这时候vs编译器就不会报错了,接下来我们新建一个NativeCode.cpp文件,复制生成的头文件里面的方法,实现此方法#include"com_taobao_jni_TestNative.h"#include<iostream>usingnamespace std;JNIEXPORT void JNICALL Java_com_taobao_jni_TestNative_sayHello (JNIEnv * env, jobjectobj) {cout<<"Hello World..."<<endl;}编译执行生成对应的dll文件,对与不同位数版本的jdk我们需要生成不同位数的dll,就如我的jdk是64位,那么我就需要编译出64位的dll,默认VS的编译指定是32bit,我们需要添加x64支持。
使用JNI实现Java与C之间传递数据Java Native Interface (JNI) 是一种允许 Java 与本地编程语言(如 C、C++)交互的机制。
它允许 Java 程序调用本地代码(C 或C++),传递数据并返回结果。
要使用 JNI 实现 Java 与 C 之间的数据传递,需要以下步骤:1. 设计本地方法:在 Java 类中定义一个本地方法,标记为 native。
例如:```javapublic class MyJNIpublic native void printMessage(String message);```2. 使用 javah 生成头文件:在命令行中,切换到包含 MyJNI 类的目录,并运行以下命令:```javah -jni MyJNI```这将生成一个名为MyJNI.h的头文件,内容包含了JNI签名。
3.实现本地方法:在C文件中实现MyJNI.h中定义的本地方法。
例如:```c#include <stdio.h>#include "MyJNI.h"JNIEXPORT void JNICALL Java_MyJNI_printMessage(JNIEnv *env, jobject obj, jstring message)const char *c_message = (*env)->GetStringUTFChars(env, message, 0);printf("%s\n", c_message);(*env)->ReleaseStringUTFChars(env, message, c_message);```在这个例子中,我们将传入的字符串打印到控制台。
4. 编译本地代码:使用 C 编译器编译 C 代码,并生成共享库文件(例如,.so 文件)。
```gcc -o libmyjni.so -shared -I /usr/lib/jvm/java/include -I /usr/lib/jvm/java/include/linux MyJNI.c```这将生成一个名为 libmyjni.so 的共享库文件。
通过JNI实现Java和C++的相互调用通过JNI实现Java和C++的相互调用一、从Java调用C++的DLL1.创建Java文件创建名为TestNative的Java文件,注意包名。
package org.druze.test;publicclass TestNative {publicnativevoid sayHello();publicvoid sayHello2(){System.out.println("Say Hello From Java");}}如代码所示,对于sayHello方法声明为native,这一部分将由C++的动态库来实现。
2.生成class文件使用javac org/druze/test/TestNative.java生成class文件注意:执行该命令在org所在目录执行。
3.使用javah命令生成相应的C++头文件使用javah org.druze.test.TestNative生成名为org_druze_test_TestNative.h的头文件注意:执行该命令在org所在目录执行。
该头文件的内容如下:/* DO NOT EDIT THIS FILE - it is machine generated */#include<jni.h>/* Header for class org_druze_test_TestNative */#ifndef _Included_org_druze_test_TestNative#define _Included_org_druze_test_TestNative#ifdef __cplusplusextern"C" {#endif/** Class: org_druze_test_TestNative* Method: sayHello* Signature: ()V*/JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif4.创建C++解决方案此处以VS2008为例。
新建一个VC++的Win32项目,选择如图所示的控制台应用程序。
项目名称为NativeCode。
点击确定后,再点击下一步,出现该页面,应用程序类型选择DLL,附加选项选择DLL5.创建号工程之后,将org_druze_test_TestNative.h导入到工程里面,并创建名为source.cpp的源代码,内容如下:#include"org_druze_test_TestNative.h"#include<iostream>using namespace std;JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello(JNIEnv *env, jobject obj){cout<<"Hello World!"<<endl;}6.在工具->选项->项目和解决方案->VC++目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jni.h和jni_md.h的路径。
7.编译,生成NativeCode.dll,并将其copy到环境变量PATH的路径下。
8.修改TestNative.javapackage org.druze.test;publicclass TestNative {publicnativevoid sayHello();publicstaticvoid main(String[] args) {// 加载动态连接库DLL,如果没有找到的话,则会在运行时报错 System.loadLibrary("NativeCode");TestNative tnt = new TestNative();tnt.sayHello();}publicvoid sayHello2(){System.out.println("Say Hello From Java");}}运行,显示“Hello World!”9.注意头文件jni.h和jni_md.h可以直接导入到工程中也可以。
10.注意NativeCode.dll必须放置在java命令能访问的路径中。
二、从C++调用Java1.创建TestNative2.Javapackage org.druze.test;publicclass TestNative2 {publicstaticvoid testPrint(){System.out.println("this is from static method"); }publicstaticint testReturn(){return 22;}publicstaticint testInput(int number){return 22+number;}publicint testInstance(int number){System.out.println("this is from instance method");return 11+number;}}2.在VS2008中创建win32控制台的应用程序,命名为NativeCode2,在向导中选择空项目。
3.在工具->选项->项目和解决方案->VC++目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jni.h和jni_md.h的路径。
或直接把jni.h和jni_md.h 导入到工程中。
4.在工具->选项->项目和解决方案->VC++目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jvm.lib的路径,并在项目->NativeCode2属性->配置属性->链接器->命令行中添加jvm.lib(这一步或者使用#pragmacomment(lib,"jvm.lib")来代替)。
或者将直接将jvm.lib添加到工程中。
5.创建Test.cpp#include<jni.h>#include<iostream>using namespace std;int main(){JavaVMOption options[1];JNIEnv * env;JavaVM * jvm;JavaVMInitArgs vm_args;options[0].optionString = "-Djava.class.path=.";vm_args.version = JNI_VERSION_1_6;vm_args.nOptions = 1;vm_args.options = options;vm_args.ignoreUnrecognized = JNI_TRUE;long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);if (status == JNI_ERR){cout<<"Can not create JVM"<<endl;return -1;}printf("Created JVM"n");jclass cls = env->FindClass("org/druze/test/TestNative2");printf("getCls"n");cout<<cls<<endl;if (cls !=0){jmethodID mid = env->GetStaticMethodID(cls, "testReturn", "()I"); printf("getMid"n");if (mid !=0){printf("testReturn"n");int result=env->CallStaticIntMethod(cls, mid);printf("call over result=%d"n",result);}mid = env->GetStaticMethodID(cls, "testPrint", "()V");if (mid !=0){printf("testPrint"n");env->CallStaticVoidMethod(cls, mid);}mid = env->GetStaticMethodID(cls, "testInput", "(I)I");if (mid !=0){printf("testInput"n");int result=env->CallStaticIntMethod(cls, mid,22);printf("call over result=%d"n",result);}mid = env->GetMethodID(cls,"<init>","()V");if (mid != 0)//获取方法成功{printf("ctro!=0"n");jobject obj=env->NewObject(cls, mid);printf("new object"n");mid = env->GetMethodID(cls, "testInstance","(I)I");if (mid!=0)//获取方法成功{printf("methodID!=0"n");jint result=env->CallIntMethod( obj, mid,22);cout<<result<<endl;}}}jvm->DestroyJavaVM();system("Pause");return 0;}6.将jvm.dll目录添加到PATH环境变量中,将org/druze/test/TestNative2复制到debug目录下执行。