JNI:C++调用java
2012-12-28 11:09
232 查看
编程人员有时会用到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:
7.将项目定位到链接器—常规项上,在附加库目录里加入C:\Program Files\Java\jdk1.6.0_07\lib,
如下图
8.将项目定位到链接器——输入项上,在附加依赖项里,加入jvm.lib,如下图
至此,虚拟机的配置就算完成了。运行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;
}
来源::http://blog.sina.com.cn/s/blog_60c069a40100hlu3.html
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:
7.将项目定位到链接器—常规项上,在附加库目录里加入C:\Program Files\Java\jdk1.6.0_07\lib,
如下图
8.将项目定位到链接器——输入项上,在附加依赖项里,加入jvm.lib,如下图
至此,虚拟机的配置就算完成了。运行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;
}
来源::http://blog.sina.com.cn/s/blog_60c069a40100hlu3.html
相关文章推荐
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- 使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库
- jni的使用(java调用c++)
- JAVA通过jni调用C++
- Java调用C/C++编写的第三方dll动态链接库(非native API)--- JNI
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- Mac OS上Java用JNI调用C++
- JAVA中使用JNI调用C++代码学习笔记
- (转)java 层调用Jni(Ndk) 持久化c c++ 对象
- 3Java程序JNI调用C++之修改属性调用方法
- linux下使用jni实现c++调用java程序(1)准备工作
- cocos2dx 使用jni实现java调用c++
- Java通过JNI调用C/C++
- windows下java JNI编程技巧——JAVA调用c/c++(0)
- Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)
- AndroidJNI 通过C++调用JAVA
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- 使用JNI,在java端调用c/c++