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