您的位置:首页 > 编程语言 > Java开发

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):

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: