window JNI_CreateJavaVM启动java程序
https://blog.csdn.net/earbao/article/details/51889605
- #define _CRT_SECURE_NO_WARNINGS 1
- #include <stdio.h>
- #include "jni.h"
- #include <stdlib.h>
- #include <windows.h>
- #include <tchar.h>
- //#pragma comment(lib, "jvm.lib")
- #define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
- #define USER_CLASSPATH "." /* where Prog.class is */
- void testEnv()
- {
- #ifdef _WIN32
- CHAR dir[1024],path[1024];
- GetCurrentDirectoryA(MAX_PATH, dir);
- sprintf(path, "set PATH=%s\\jre\\bin\\client;.;", dir);
- system(path);
- printf("%s\n", path);
- /**
- //set PATH=%PATH%;%currentdir%\jre\bin\client;
- TCHAR dir[1024];
- GetCurrentDirectoryA(MAX_PATH, dir);
- CHAR p[1024], path[1024];
- GetEnvironmentVariableA("PATH", p, 1024);
- sprintf("PATH = %s\n", p);
- sprintf(path, "%s;%s\\jre\\bin\\client", p, dir);
- system(path);
- printf("%s\n", path);
- GetEnvironmentVariableA("PATH", path, 1024);
- printf("PATH = %s\n", path);
- */
- #else
- char * p;
- if ((p = getenv("USER")))
- printf("USER = %s\n", p);
- setenv("USER", "test", 1);
- printf("USER = %s\n", getenv("USER"));
- unsetenv("USER");
- printf("USER = %s\n", getenv("USER"));
- #endif // __WIN32
- }
- //window JNI_CreateJavaVM启动java程序
- int main(int argc, char* argv[])
- {
- JNIEnv *env;
- JavaVM *jvm;
- jint res;
- jclass cls;
- jmethodID mid;
- jstring jstr;
- jclass stringClass;
- jobjectArray args;
- testEnv();
- CHAR dir[1024], path[1024];
- GetCurrentDirectoryA(MAX_PATH, dir);
- sprintf(path, "%s\\jre\\bin\\client\\jvm.dll", dir);
- typedef jint (*JNI_CreateJavaVMT)(JavaVM **pvm, void **penv, void *args);
- JNI_CreateJavaVMT pJNI_CreateJavaVM = (JNI_CreateJavaVMT)GetProcAddress(LoadLibraryA(path), "JNI_CreateJavaVM");
- if (pJNI_CreateJavaVM == NULL)
- {
- printf("pJNI_CreateJavaVM == NULL\n");
- }
- else
- {
- printf("pJNI_CreateJavaVM != NULL\n");
- }
- #ifdef JNI_VERSION_1_2
- JavaVMInitArgs vm_args;
- JavaVMOption options[1];
- options[0].optionString ="-Djava.class.path=.";
- vm_args.version = 0x00010002;
- vm_args.options = options;
- vm_args.nOptions = 1;
- vm_args.ignoreUnrecognized = JNI_TRUE;
- /* Create the Java VM */
- res = pJNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
- #else
- JDK1_1InitArgs vm_args;
- char classpath[1024];
- vm_args.version = 0x00010001;
- JNI_GetDefaultJavaVMInitArgs(&vm_args);
- /* Append USER_CLASSPATH to the default system class path */
- sprintf(classpath, "%s%c%s",
- vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
- vm_args.classpath = classpath;
- /* Create the Java VM */
- res = JNI_CreateJavaVM(&jvm, &env, &vm_args);
- #endif /* JNI_VERSION_1_2 */
- if (res < 0) {
- fprintf(stderr, "Can't create Java VM\n");
- exit(1);
- }
- 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, " from C!");
- if (jstr == NULL) {
- goto destroy;
- }
- stringClass = (*env)->FindClass(env, "java/lang/String");
- args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
- if (args == NULL) {
- goto destroy;
- }
- (*env)->CallStaticVoidMethod(env, cls, mid, args);
- destroy:
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- }
- (*jvm)->DestroyJavaVM(jvm);
- }
- import java.io.IOException;
- public class Prog {
- public static void main(String[] args) throws IOException {
- //System.out.println(args.length);
- if(args.length>0)
- {
- System.out.println("Hello World " + args[0]);
- }else{
- System.out.println("Hello World ");
- }
- System.in.read();
- }
- }
exe通过jni调用Java程序
- #define _CRT_SECURE_NO_WARNINGS 1
- #include <stdio.h>
- #include "jni.h"
- #include <stdlib.h>
- #include <windows.h>
- #include <tchar.h>
- //#pragma comment(lib, "jvm.lib")
- #define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
- #define USER_CLASSPATH "." /* where Prog.class is */
- void testEnv()
- {
- CHAR dir[1024], path[1024];
- GetCurrentDirectoryA(MAX_PATH, dir);
- sprintf(path, "set PATH=%s\\jre\\bin\\client;.;", dir);
- system(path);
- printf("%s\n", path);
- sprintf(path, "set PATH=%s\\jre\\bin\\server;.;", dir);
- system(path);
- printf("%s\n", path);
- }
- //window JNI_CreateJavaVM启动java程序
- int main(int argc, char* argv[])
- {
- JNIEnv *env;
- JavaVM *jvm;
- jint res;
- jclass cls;
- jmethodID mid;
- jstring jstr;
- jclass stringClass;
- jobjectArray args;
- //testEnv();
- CHAR dir[1024], path[1024];
- GetCurrentDirectoryA(MAX_PATH, dir);
- //注意exe的位数64bit/32bit要和jdk的相匹配
- HMODULE handle = NULL;
- if (argc > 1)
- {
- sprintf(path, "%s", argv[1]);
- printf("%s\n", path);
- handle=LoadLibraryA(path);
- }
- if (handle == NULL)
- {
- sprintf(path, "%s\\jre\\bin\\client\\jvm.dll", dir);
- printf("%s\n", path);
- handle = LoadLibraryA(path);
- }
- if (handle == NULL)
- {
- sprintf(path, "%s\\jre\\bin\\server\\jvm.dll", dir);
- printf("%s\n", path);
- handle = LoadLibraryA(path);
- }
- if (handle == NULL)
- {
- handle = LoadLibraryA("jvm.dll");
- }
- if (handle == NULL)
- {
- printf("handle==NULL\n");
- return -1;
- }
- typedef jint(*JNI_CreateJavaVMT)(JavaVM **pvm, void **penv, void *args);
- JNI_CreateJavaVMT pJNI_CreateJavaVM = (JNI_CreateJavaVMT)GetProcAddress(handle, "JNI_CreateJavaVM");
- if (pJNI_CreateJavaVM == NULL)
- {
- printf("pJNI_CreateJavaVM == NULL\n");
- }
- else
- {
- printf("pJNI_CreateJavaVM != NULL\n");
- }
- //初始化jvm参数 http://blog.csdn.net/louka/article/details/7101562
- JavaVMInitArgs vm_args;
- JavaVMOption options[2];
- //搜索的类路径。把java类和jar包放在当前目录下
- #if _WIN32
- options[0].optionString = "-Djava.class.path=.;test.jar"; //这里指定了要使用的第三方Jar包
- #else
- options[0].optionString = "-Djava.class.path=.:test.jar"; //这里指定了要使用的第三方Jar包
- #endif
- options[1].optionString = "-verbose:NONE"; //用于跟踪运行时的信息
- vm_args.version = 0x00010002;
- vm_args.options = options;
- vm_args.nOptions = 1;
- vm_args.ignoreUnrecognized = JNI_TRUE;
- /* Create the Java VM */
- res = pJNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
- if (res < 0) {
- fprintf(stderr, "Can't create Java VM\n");
- exit(1);
- }
- 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, " from C!");
- if (jstr == NULL) {
- goto destroy;
- }
- stringClass = (*env)->FindClass(env, "java/lang/String");
- args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
- if (args == NULL) {
- goto destroy;
- }
- (*env)->CallStaticVoidMethod(env, cls, mid, args);
- (*env)->DeleteLocalRef(env, cls);
- (*env)->DeleteLocalRef(env, jstr);
- (*env)->DeleteLocalRef(env, stringClass);
- (*env)->DeleteLocalRef(env, args);
- destroy:
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- }
- (*jvm)->DestroyJavaVM(jvm);
- FreeLibrary(handle);
- }
源码下载(右键另存为zip):
window JNI_CreateJavaVM启动java程序的更多相关文章
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...
- Linux上设置开机启动Java程序
在Linux上设置开机启动Java程序,例如:test.jar 在Linux上启动Java程序的命令: nohup java -jar test.jar >/dev/>& & ...
- eclipse通过maven建立java se工程配置log4j,打包成zip,将jar包和配置文件分开,并以bat和sh文件启动java程序
一.新建maven的java工程 1.eclipse里file-new-other,选择maven Project 2.选中 Use default Workspace location,然后 nex ...
- 利用脚本启动java程序
今天在工作中,需要写一个shell脚本,启动一个socket程序,从而模拟短信网关.查了一些资料,终于搞定了,现在记录一下,方便大家查阅. 为了说明使用方法,我们就用最简单的程序来实现,比如我们要运行 ...
- ActiveMQ(下载,启动,java程序中 如何操作)
为了快速上手ActiveMQ 找个一个windows版本的mq来实现它的功能 1.http://activemq.apache.org/activemq-5158-release.html 下载 2. ...
- shell脚本启动java程序
#!/bin/bash ### 切换到工作目录 bin=$(cd `dirname ${0}`;pwd) cd ${bin} echo "bin [${bin}] .." ### ...
- java_linux_shell_定时kill 启动java程序
#!/bin/bash #while truedo Process_ID=`ps -ef |grep 'LoginSinaWeiboCookie.jar' |grep -v grep |awk '{p ...
- Shell 启动java程序
#!/bin/sh SHELL_PATH=$(cd ")";pwd) echo $SHELL_PATH cd "$SHELL_PATH" CLASSPATH=. ...
- Window 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题。
现象: 解决办法: 方法一:缺什么补什么 http://www.greenxf.com/soft/125654.html 把api-ms-win-crt-runtime-l1-1-0.dll下载到电脑 ...
随机推荐
- Python 全栈开发五 迭代器 生成器 装饰器
一.迭代器 迭代协议:对象必须提供一个next方法,执行该方法后会返回迭代的下一项或者抛出Stopiteration异常,终止迭代.切只能往前,不能倒退. 可迭代对象:遵循迭代写一点对象就是可迭代对象 ...
- Vbox下的linux和windows共享文件设置
参考链接: https://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html
- gem安装出错了
1.首先是SSL出错. SSL 证书错误 正常情况下,你是不会遇到 SSL 证书错误的,除非你的 Ruby 安装方式不正确. 如果遇到 SSL 证书问题,你又无法解决,请修改 ~/.gemrc 文件, ...
- Mac使用数据线连接ios,安装deb
原创http://www.cnblogs.com/fply/p/8478702.html mac连接ios mac连接ios需要用到usbmuxd,这个可自行下载 到python-client目录下, ...
- sqli-labs(十五)(堆叠注入)
第三十八关: 后面好几关都是堆叠注入.简单介绍下: Stacked injections:堆叠注入.从名词的含义就可以看到应该是一堆sql语句(多条)一起执行.而在真实的运用中也是这样的,我们知道在m ...
- HTTP参数污染【转】
HTTP参数污染注入源于网站对于提交的相同的参数的不同处理方式导致. 例如: www.XX.com/a?key=ab&key=3 如果服务端返回输入key的值,可能会有 一: ab 二:3 三 ...
- 018-AJAX异步请求XMLHttpRequest
创建XMLHttpRequest对象 一.先来创建XMLHttpRequest对象在IE.Firefox.safari和Opera中创建该对象的JavaScript代码为: var xhr = new ...
- python windows 安装gensim
安装gensim要确定numpy和scipy安装 再安装gensim
- RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试
RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试 特别说明: 电源接反,电机驱动板接反将有可能烧毁芯片和电路,请再三确认后再进行通电. 如何使用: 1.需要用到的模块或器件: Arduin ...
- html5-textarea元素
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...