Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
Здравствуйте, artgonch, Вы писали:
A>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
Да уж вроде обсуждалось и не раз.
Можно поискать тут
Здравствуйте, DrZubr, Вы писали:
A>>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
DZ>Да уж вроде обсуждалось и не раз. DZ>Можно поискать тут
А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler".
Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
Здравствуйте, Blazkowicz, Вы писали:
B>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler". B>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
JIT compiler — это не совсем то, он компиляет код во время исполнения.
Здравствуйте, Cider, Вы писали:
B>>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler". B>>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
C>JIT compiler — это не совсем то, он компиляет код во время исполнения.
А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его...
Или я что-то не то читал?
Здравствуйте, Blazkowicz, Вы писали:
C>>JIT compiler — это не совсем то, он компиляет код во время исполнения.
B>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его... B>Или я что-то не то читал?
Здравствуйте, m.a.g., Вы писали:
C>>>JIT compiler — это не совсем то, он компиляет код во время исполнения.
B>>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его... B>>Или я что-то не то читал?
MAG>Ага, только этот код теряется после выполнения.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Cider, Вы писали:
B>>>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler". B>>>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
C>>JIT compiler — это не совсем то, он компиляет код во время исполнения.
B>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его... B>Или я что-то не то читал?
Он компилит его, но только в тот момент, когда класс запрашивается первый раз. Как я понял человеку нужно откомпилировать класс до момента его первого использования.
Здравствуйте, Blazkowicz, Вы писали:
B>Значит это только борьба за производительность...
Именно, но насчет компиляции вместо интерпретации — это не совсем так.
Машина исполняет байт-код и при этом его анализирует (точнее перед этим), если попадается кусок кода, который можно откомпилировать с существенным выигрышем в производительности (цикл, например), она это делает... Т.е. jit компилятор является ее частью. И он не компилит весь код, только его часть.
Здравствуйте, artgonch, Вы писали:
A>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
Это делается через JNI.
Я вытащил оттуда примерчик кода на С, который в свою очередь тащит код на JAVA
Это на С:
#include <jni.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'#else/* UNIX */#define PATH_SEPARATOR ':'#endif
#define USER_CLASSPATH "."/* where Prog.class is */
main() {
JNIEnv *env;
JavaVM *jvm;
JDK1_1InitArgs vm_args;
jint res;
jclass cls;
jmethodID mid;
jstring jstr;
jobjectArray args;
char classpath[1024];
/* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond */
vm_args.version = 0x00010001;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
/* Append USER_CLASSPATH to the end of 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);
if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
cls = (*env)->FindClass(env, "Prog");
if (cls == 0) {
fprintf(stderr, "Can't find Prog class\n");
exit(1);
}
mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
if (mid == 0) {
fprintf(stderr, "Can't find Prog.main\n");
exit(1);
}
jstr = (*env)->NewStringUTF(env, " from C!");
if (jstr == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
args = (*env)->NewObjectArray(env, 1,
(*env)->FindClass(env, "java/lang/String"), jstr);
if (args == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
(*env)->CallStaticVoidMethod(env, cls, mid, args);
(*jvm)->DestroyJavaVM(jvm);
}
А вот то, что он вызывает
public class Prog {
public static void main(String[] args) {
System.out.println("Hello World" + args[0]);
}
}
Гарантировать, что это работает не могу — у меня нет компилятора на машине. Но я помню, что по этому коду я разбирался и реально все работало.
Здравствуйте, Cider, Вы писали:
C>Именно, но насчет компиляции вместо интерпретации — это не совсем так. C>Машина исполняет байт-код и при этом его анализирует (точнее перед этим), если попадается кусок кода, который можно откомпилировать с существенным выигрышем в производительности (цикл, например), она это делает... Т.е. jit компилятор является ее частью. И он не компилит весь код, только его часть.
Вот пока какую-нибудь лажу не запостишь, ничего интересного и не узнаешь...
Да вы меня не совсем правильно поняли! Мне не нужен JIT, не нужен исполняемый файл со встроенной JRE. Мне нужнен просто маленький исполняемый файл, который бы вызывал JRE и передавал ей мой главный класс. Вот и все. Ведь так и работают JDeveloper, JBuilder, NetBeans! Как это сделано?
Здравствуйте, 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.
Здравствуйте, artgonch, Вы писали:
A>Да вы меня не совсем правильно поняли! Мне не нужен JIT, не нужен исполняемый файл со встроенной JRE. Мне нужнен просто маленький исполняемый файл, который бы вызывал JRE и передавал ей мой главный класс. Вот и все. Ведь так и работают JDeveloper, JBuilder, NetBeans! Как это сделано?