window JNI_CreateJavaVM启动java程序

309 篇文章 5 订阅
#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):



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值