Здравствуйте, AnSa, Вы писали:
AS>Здравствуйте, artgonch, Вы писали:
A>>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
AS>Это делается через JNI.
AS>Я вытащил оттуда примерчик кода на С, который в свою очередь тащит код на JAVA
AS>Это на С:
AS>AS>#include <jni.h>
AS>#ifdef _WIN32
AS>#define PATH_SEPARATOR ';'
AS>#else /* UNIX */
AS>#define PATH_SEPARATOR ':'
AS>#endif
AS>#define USER_CLASSPATH "." /* where Prog.class is */
AS>main() {
AS> JNIEnv *env;
AS> JavaVM *jvm;
AS> JDK1_1InitArgs vm_args;
AS> jint res;
AS> jclass cls;
AS> jmethodID mid;
AS> jstring jstr;
AS> jobjectArray args;
AS> char classpath[1024];
AS> /* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond */
AS> vm_args.version = 0x00010001;
AS> JNI_GetDefaultJavaVMInitArgs(&vm_args);
AS> /* Append USER_CLASSPATH to the end of default system class path */
AS> sprintf(classpath, "%s%c%s",
AS> vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
AS> vm_args.classpath = classpath;
AS> /* Create the Java VM */
AS> res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
AS> if (res < 0) {
AS> fprintf(stderr, "Can't create Java VM\n");
AS> exit(1);
AS> }
AS> cls = (*env)->FindClass(env, "Prog");
AS> if (cls == 0) {
AS> fprintf(stderr, "Can't find Prog class\n");
AS> exit(1);
AS> }
AS> mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
AS> if (mid == 0) {
AS> fprintf(stderr, "Can't find Prog.main\n");
AS> exit(1);
AS> }
AS> jstr = (*env)->NewStringUTF(env, " from C!");
AS> if (jstr == 0) {
AS> fprintf(stderr, "Out of memory\n");
AS> exit(1);
AS> }
AS> args = (*env)->NewObjectArray(env, 1,
AS> (*env)->FindClass(env, "java/lang/String"), jstr);
AS> if (args == 0) {
AS> fprintf(stderr, "Out of memory\n");
AS> exit(1);
AS> }
AS> (*env)->CallStaticVoidMethod(env, cls, mid, args);
AS> (*jvm)->DestroyJavaVM(jvm);
AS>}
AS>
AS>А вот то, что он вызывает
AS>AS>public class Prog {
AS> public static void main(String[] args) {
AS> System.out.println("Hello World" + args[0]);
AS> }
AS>}
AS>
AS>Гарантировать, что это работает не могу — у меня нет компилятора на машине. Но я помню, что по этому коду я разбирался и реально все работало.
AS>Плюс сама ссылочка на документацию здесь
Интересно, кто-нибудь пробовал данный код?
Если да, то пожалуйста поделитесь впечатлениями.
У меня j2sdk1.4.2_07 и VC++6.0 и почему-то не работает, JNI_CreateJavaVM всегда возвращает -1.