C++中怎么嵌入JAVA
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章给大家介绍C++中怎么嵌入JAVA,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、启动虚拟机的参数基本参数需要两个:JNI 动态库的路径通过java.library.p
千家信息网最后更新 2025年12月01日C++中怎么嵌入JAVA
这篇文章给大家介绍C++中怎么嵌入JAVA,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
一、启动虚拟机的参数
基本参数需要两个:
JNI 动态库的路径通过java.library.path设置。
程序jar文件通过java.class.path设置。
static string toClassPath(const string& program) { return string("-Djava.class.path=") + program;}...jvmopt[0].optionString = (char*)"-Djava.library.path=./lib";jvmopt[1].optionString = (char*)classPath.c_str()二、调用main函数
这里我需要把宽度和高度两个参数,通过main函数传递给java程序。
static jobjectArray prepareProgramArgs(JNIEnv* env, const char* w, const char* h) { jobjectArray ret= (jobjectArray)env->NewObjectArray(2, env->FindClass("java/lang/String"), env->NewStringUTF("")); env->SetObjectArrayElement(ret,0, env->NewStringUTF(w)); env->SetObjectArrayElement(ret,1, env->NewStringUTF(h)); return ret;}... jmethodID methodId = env->GetStaticMethodID(jcls, "main", "([Ljava/lang/String;)V"); if (methodId != NULL) { jobjectArray args = prepareProgramArgs(env, w, h); env->CallStaticVoidMethod(jcls, methodId, args); if (env->ExceptionCheck()) { env->ExceptionDescribe(); env->ExceptionClear(); } }三、完整代码
#include#include #include using namespace std;static string toClassName(const string& program) { string className; size_t start = program.find_last_of('/'); size_t end = program.find_last_of('.'); if(start == std::string::npos) { start = program.find_last_of('\\'); if(start == std::string::npos) { start = -1; } } className = program.substr(start+1, end - start - 1); return className;} static string toClassPath(const string& program) { return string("-Djava.class.path=") + program;}static jobjectArray prepareProgramArgs(JNIEnv* env, const char* w, const char* h) { jobjectArray ret= (jobjectArray)env->NewObjectArray(2, env->FindClass("java/lang/String"), env->NewStringUTF("")); env->SetObjectArrayElement(ret,0, env->NewStringUTF(w)); env->SetObjectArrayElement(ret,1, env->NewStringUTF(h)); return ret;}int main(int argc, char** argv) { JavaVM* javaVM; JNIEnv* jniEnv; string program; string classPath; string className; const char* w = "320"; const char* h = "480"; JavaVMInitArgs vmArgs; JavaVMOption jvmopt[2]; if(argc < 2) { printf("Usage: %s jar [w] [h]\n", argv[0]); return 0; } if(argc > 2) { w = argv[2]; } if(argc > 3) { h = argv[3]; } program = argv[1]; className = toClassName(program); classPath = toClassPath(program); jvmopt[0].optionString = (char*)"-Djava.library.path=./lib"; jvmopt[1].optionString = (char*)classPath.c_str(); vmArgs.options = jvmopt; vmArgs.version = JNI_VERSION_1_8; vmArgs.ignoreUnrecognized = JNI_TRUE; vmArgs.nOptions = sizeof(jvmopt) / sizeof(jvmopt[0]); long flag = JNI_CreateJavaVM(&javaVM, (void**)&jniEnv, &vmArgs); if (flag == JNI_ERR) { cout << "Error creating VM. Exiting...\n"; return 1; } JNIEnv* env = jniEnv; jclass jcls = env->FindClass(className.c_str()); if (jcls == NULL) { jniEnv->ExceptionDescribe(); javaVM->DestroyJavaVM(); return 1; } if (jcls != NULL) { jmethodID methodId = env->GetStaticMethodID(jcls, "main", "([Ljava/lang/String;)V"); if (methodId != NULL) { jobjectArray args = prepareProgramArgs(env, w, h); env->CallStaticVoidMethod(jcls, methodId, args); if (env->ExceptionCheck()) { env->ExceptionDescribe(); env->ExceptionClear(); } } else { cout << "Not found main, Exiting...\n"; } } else { cout << "Not found class , Exiting...\n"; } javaVM->DestroyJavaVM(); return 0;}
四、编译和链接
JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
头文件路径。
$JAVA_HOME/include$JAVA_HOME/include/darwin
库的路径。
$JAVA_HOME/jre/lib/server
库的名称。 libjvm
运行时库的路径
export DYLD_LIBRARY_PATH="$JAVA_HOME/jre/lib/server"
五、命令函数参数
编译通过,以为大功告成,运行时却提示找不到JRE。原来安装了JDK还不行,还需另外在安装JRE,安装之后AWTK显示正常。
./bin/awtkRun bin/DemoButton.jar
关于C++中怎么嵌入JAVA就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
参数
路径
函数
C++
两个
内容
文件
更多
程序
帮助
编译
运行
不行
不错
大功告成
代码
兴趣
动态
名称
命令
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全儿童新闻
网络安全靠人民手抄报小学生
从哪里看服务器ip
警察网络安全攻防演练
服务器mars卡住
mogondb配置数据库
网络安全工程师相关的公司
光遇游戏服务器是什么怎么填
数据库修改网站后台密码解码
互联网服务器架构设计内容
我的世界服务器ess公告
海康服务器硬盘灯亮黄灯
清远仓库管理软件开发
软件开发工程师有哪些证书
网络安全厂商是甲方还是乙方
手机屏幕维修后无法连接服务器
office服务器很慢
有关通信网络安全的标语
联想服务器故障灯大全
海南龙芯服务器价钱
网络安全知识线上答题毕节
南昌网络安全直播
网络技术 百度百科
南京华为工厂网络技术工招聘
清远仓库管理软件开发
数据库闭包python代码实现
dnf客户端没有服务器列表
数据库导入dmp加载错误
软件开发哪里比较好
松江区项目数据库清单