window JNI_CreateJavaVM启动java程序
2016-07-12 15:41
274 查看
#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):
相关文章推荐
- Java学习之Iterator(迭代器)的一般用法 (转)
- 14web启动将数据加载到内存中
- 13Spring文件上传下载
- 12StringUtils类
- 11Spring MVC异常处理
- spring 事务详解
- Java操纵postgresql
- JAVA 图片处理
- Spring-7:使用外部属性文件
- Java XML解析工具 dom4j介绍及使用实例
- java初识类和对象
- 如何看jdk源码
- 关于struts2文件上传中的uploadContentType和uploadFileName
- 理解Java中的动态代理
- SpringMVC数据交互方式
- Maven的初次使用
- Java序列化
- 并发框架Disruptor译文
- java之时间格式
- java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Sessio