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