c++调用java jar 实列

mac2026-05-14  6

使用c++调用java,具体流程是通过c++编写加载JVM、java类和方法的方式来进行java代码的运行。

要运行java代码,当然需要jdk环境,本文使用vs2017讲解。

1. 新建一个c++的空项目

2. 需要配置vs2017中的jdk环境,保证在运行时能够找到对应的Java环境,配置过程如下:

       右键项目 --> 属性 --> 配置属性--> VC++目录--> 包含目录 -->  点击编辑配置java_home/include和java_home/include/win32

       右键项目 --> 属性 --> 配置属性--> VC++目录--> 库目录 --> 点击编辑配置java_home/lib

        右键项目 --> 属性 --> 配置属性--> 连接器--> 附加库目录 --> 点击编辑配置java_home/lib

        右键项目 --> 属性 --> 配置属性--> 连接器--> 输入 --> 附加依赖项 --> 添加 jvm.lib

        点击 应用 --> 确定后配置完成

3. 新建一个源文件,输入代码如下:

#include <windows.h> #include <jni.h> // 引入jni头文件 #include <iostream> #include <stdarg.h> using namespace std; int main() { cout << "begin" << endl; JavaVMOption options[1]; JavaVMInitArgs vm_args; JavaVM *jvm; JNIEnv *env; jclass cls; jmethodID mid; jobject jobj; HINSTANCE hInstance; long status; options[0].optionString = "-Djava.class.path=xxx"; // jar包所在路径 vm_args.version = JNI_VERSION_1_8; // 更具不同的jdk配置 vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; const char szJvmPath[] = "xxx//xx//jvm.dll"; // 设置jvm.dll的路径 hInstance = ::LoadLibrary(szJvmPath); // 加载动态链接库 if (hInstance == NULL) { cout << "链接库加载失败" << endl; cout << ::GetLastError() << endl; cout << hInstance << endl; int x; cin >> x; //让程序暂停 return -1; } //取得里面的JNI_CreateJavaVM函数指针 typedef jint(WINAPI *PFunCreateJavaVM)(JavaVM **, void **, void *); PFunCreateJavaVM funCreateJavaVM = (PFunCreateJavaVM)::GetProcAddress(hInstance, "JNI_CreateJavaVM"); status = (*funCreateJavaVM)(&jvm, (void**)&env, &vm_args); // 创建jvm虚拟机 if (status == JNI_ERR) { cout << "虚拟机创建失败" << endl; return -2; } cls = env->FindClass("class full path"); //找到类定义 类的全限定名如: cn/xx/xx/Demo if (cls == 0) { cout << "自定义类加载失败" << endl; return -3; } jmethodID constr = env->GetMethodID(cls, "<init>", "()V"); // 获得类的构造方案 调用类的静态方法可以不用new 出新的对象。 后面直接使用CallStatixxxxMethod即可 jobj = env->NewObject(cls,constr); // 新建java对象 mid = env->GetMethodID(cls, "methodName", "method sign"); // 获得要调用方法的id 传入类定义 方法名 和方法签名 if (mid == 0) { cout << "无此方法" << endl; return -4; } xxx jres = (xxx)env->CallxxxMethod(jobj, mid, ...); // ... 表示方法的参数 jvm->DestroyJavaVM(); // 销毁jvm int x; cin >> x; // 停止一下 }

        

     

最新回复(0)