Мне нужно выполнить простое приложение Java в качестве службы Windows. Я написал следующий код, но это дает мне исключение:
Prog.java:
public class Prog {
public static void main(String[] args) {
System.out.println("Hello World ");
}
}
Invoke.cpp:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <winbase.h>
#include<iostream.h>
#include<conio.h>
#include "jni.h"
#define RUNTIME_DLL _T("C:\\Program Files\\Java\\jdk1.6.0_02\\jre\\bin\\client\\jvm.dll")
#define CLASS_NAME "Prog.class"#define CLASS_PATH "-Djava.class.path=C:\\Prog.jar"
typedef jint (JNICALL *CreateJavaVM)(JavaVM **pvm, void **penv, void *args);
CreateJavaVM createJVM;
int InvokeMain() {
printf("Invoke Main \n");
JavaVM *vm;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
jint res;
JNIEnv *env;
jclass cls;
jmethodID mid;
printf("Invoke Main 2 \n");
options[0].optionString = CLASS_PATH;
vm_args.version = JNI_VERSION_1_4;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_FALSE;
//load the JVM DLL
HINSTANCE handle = LoadLibrary(RUNTIME_DLL);
if( handle == 0) {
printf("Failed to load jvm dll %s\n", RUNTIME_DLL);
return -1;
}
//get the function pointer to JNI_CreateJVM
createJVM = (CreateJavaVM)GetProcAddress(handle, "JNI_CreateJavaVM");
res = createJVM(&vm, (void **)&env, &vm_args);
if (res < 0) {
printf("Error creating JVM");
return -1;
}//locate the class
cls = env->FindClass(CLASS_NAME);
if(cls == 0) {
printf("Exception in thread \"main\" java.lang.NoClassDefFoundError: %s\n", CLASS_NAME);
return -1;
}
//get the method id of main
mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
if(mid == 0) {
printf("Exception in thread \"main\" java.lang.NoSuchMethodError: main\n");
return -1;
}
//invoke the main method with no parameters
env->CallStaticVoidMethod(cls, mid, 0);
if(env->ExceptionCheck()) {
env->ExceptionDescribe();
return -1;
}
return 0;
}int _tmain(int argc, _TCHAR* argv[])
{
cout<<"start \n";
return InvokeMain();
getch();
return 0;
}
При выполнении этого я получаю исключение NoCLassDefinition.
Задача ещё не решена.
Других решений пока нет …