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下载到电脑 ...
随机推荐
- vue ie
http://www.jb51.net/article/118792.htm https://blog.csdn.net/landl_ww/article/details/79149461 解决 安装 ...
- function module 调用类对象
1: 定义一个类,编辑里面的方法 method METHOD1. write EV_P2. ev_p1 = 'test'. endmethod. 2:在其它function module 中调用
- [js]arguments属性
类数组 具有length属性的对象称为类数组 观察他的顺序 为什么能转换 for(let i=0;i<arr.length;i++){ console.log(arr[i]); } https: ...
- Django 框架 数据库操作2
一.ORM的操作方法总结 get(self, *args, **kwargs): # 获取单个对象 def one_get(request): #直接得到一个表对象,也就是表记录 如果得到多个会报错 ...
- Windows Server 2008服务器上测试几个站点,改完host居然没有生效
Windows Server 2008服务器上测试几个站点,改完host居然没有生效看了下资料,估计是因为Dnscache这个服务引起的(DNS Client)于是从服务了把他禁用掉,果然host生效 ...
- 20165321 学习基础与C语言学习心得
一.技能学习 我其实在小时候学过挺多东西,在我小学的时候,我曾经短时间地学过小提琴.拉丁舞.国画.书法,但是,由于各种原因,都没有继续学习下去.后来,在我小学四年级的时候,我接触到了二胡,于是,我开始 ...
- check process id exists
kill -0 pid sending the signal 0 to a given PID just checks if any process with the given PID is run ...
- (转)Xcode导航快捷键(大全)
Xcode导航快捷键1.工程导航器:Command+1快速浏览代码.图片以及用户界面文件. 2.显示/隐藏导航器面板:Command+0当你在对屏幕进行截图的时候可能会想要隐藏起与你感兴趣内容的无关的 ...
- Hibernate框架的第四天
## Hibernate框架的第四天 ## ---------- **回顾:Hibernate框架的第三天** 1. 一对多关联关系映射 * JavaBean的编写 * 编写映射的配置文件 * 使用级 ...
- InstallShield2015制作安装包----------安装后实现电脑开机自启动
开机自启动有两个方法: 一 .把程序的快捷方式放在”开始---启动“目录下. 二.把程序的安装目录放在注册表”“. 实现方法一: 1.编写bat脚本.执行bat启动exe. a)核心:cmd命令 : ...