class -> exe
От: artgonch  
Дата: 12.01.04 16:34
Оценка:
Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
Re: class -> exe
От: DrZubr Беларусь  
Дата: 12.01.04 18:08
Оценка: +1
Здравствуйте, artgonch, Вы писали:

A>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.


Да уж вроде обсуждалось и не раз.
Можно поискать тут
ICQ [168117153]
Re[2]: class -> exe
От: Blazkowicz Россия  
Дата: 13.01.04 06:42
Оценка:
Здравствуйте, DrZubr, Вы писали:

A>>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.


DZ>Да уж вроде обсуждалось и не раз.

DZ>Можно поискать тут

А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler".
Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
Re[3]: class -> exe
От: Cider Россия  
Дата: 13.01.04 08:06
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler".

B>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.

JIT compiler — это не совсем то, он компиляет код во время исполнения.

Cider
Cider
Re[4]: class -> exe
От: Blazkowicz Россия  
Дата: 13.01.04 08:36
Оценка:
Здравствуйте, Cider, Вы писали:

B>>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler".

B>>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.

C>JIT compiler — это не совсем то, он компиляет код во время исполнения.


А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его...
Или я что-то не то читал?
Re[5]: class -> exe
От: m.a.g. Мальта http://dottedmag.net/
Дата: 13.01.04 09:28
Оценка: 5 (1)
Здравствуйте, Blazkowicz, Вы писали:

C>>JIT compiler — это не совсем то, он компиляет код во время исполнения.


B>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его...

B>Или я что-то не то читал?

Ага, только этот код теряется после выполнения.
... << RSDN@Home 1.1.2 beta 2 >>
Re[6]: class -> exe
От: Blazkowicz Россия  
Дата: 13.01.04 09:41
Оценка:
Здравствуйте, m.a.g., Вы писали:

C>>>JIT compiler — это не совсем то, он компиляет код во время исполнения.


B>>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его...

B>>Или я что-то не то читал?

MAG>Ага, только этот код теряется после выполнения.


Значит это только борьба за производительность...
Re[5]: class -> exe
От: Mishka Норвегия  
Дата: 13.01.04 11:49
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Cider, Вы писали:


B>>>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler".

B>>>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.

C>>JIT compiler — это не совсем то, он компиляет код во время исполнения.


B>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его...

B>Или я что-то не то читал?

Он компилит его, но только в тот момент, когда класс запрашивается первый раз. Как я понял человеку нужно откомпилировать класс до момента его первого использования.
Re[7]: class -> exe
От: Cider Россия  
Дата: 13.01.04 13:24
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Значит это только борьба за производительность...


Именно, но насчет компиляции вместо интерпретации — это не совсем так.
Машина исполняет байт-код и при этом его анализирует (точнее перед этим), если попадается кусок кода, который можно откомпилировать с существенным выигрышем в производительности (цикл, например), она это делает... Т.е. jit компилятор является ее частью. И он не компилит весь код, только его часть.

Cider
Cider
Re: class -> exe
От: AnSa Россия  
Дата: 13.01.04 13:53
Оценка:
Здравствуйте, 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]);
    }
}


Гарантировать, что это работает не могу — у меня нет компилятора на машине. Но я помню, что по этому коду я разбирался и реально все работало.

Плюс сама ссылочка на документацию здесь
Re[8]: class -> exe
От: Blazkowicz Россия  
Дата: 13.01.04 14:40
Оценка: :)
Здравствуйте, Cider, Вы писали:

C>Именно, но насчет компиляции вместо интерпретации — это не совсем так.

C>Машина исполняет байт-код и при этом его анализирует (точнее перед этим), если попадается кусок кода, который можно откомпилировать с существенным выигрышем в производительности (цикл, например), она это делает... Т.е. jit компилятор является ее частью. И он не компилит весь код, только его часть.

Вот пока какую-нибудь лажу не запостишь, ничего интересного и не узнаешь...
Re[9]: class -> exe
От: artgonch  
Дата: 13.01.04 16:38
Оценка:
Да вы меня не совсем правильно поняли! Мне не нужен JIT, не нужен исполняемый файл со встроенной JRE. Мне нужнен просто маленький исполняемый файл, который бы вызывал JRE и передавал ей мой главный класс. Вот и все. Ведь так и работают JDeveloper, JBuilder, NetBeans! Как это сделано?
Re[2]: class -> exe
От: morbilli  
Дата: 31.03.05 15:28
Оценка:
Здравствуйте, 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.
Re: class -> exe
От: fefelov Россия  
Дата: 01.04.05 19:18
Оценка:
Бесплатные:
http://jsmooth.sourceforge.net/
http://www.rolemaker.dk/nonRoleMaker/javalauncher/marner_java_launcher.htm
http://www.xenoage.com/jestart/

Коммерческие:
http://www.ej-technologies.com/products/exe4j/overview.html
http://www.duckware.com/jexepack/index.html
http://www.dobysoft.com/products/nativej/
Re[10]: class -> exe
От: Alexey Chen Чили  
Дата: 02.04.05 05:45
Оценка:
Здравствуйте, artgonch, Вы писали:

A>Да вы меня не совсем правильно поняли! Мне не нужен JIT, не нужен исполняемый файл со встроенной JRE. Мне нужнен просто маленький исполняемый файл, который бы вызывал JRE и передавал ей мой главный класс. Вот и все. Ведь так и работают JDeveloper, JBuilder, NetBeans! Как это сделано?


Посмотри здесь ... http://www.spritecraft.com/download/dev/arabica.zip

Если коротко, то примерно так


#if __JRE_VERSION == 118
static const pchar_t jvmdll = "jre118/javai.dll";
static const pchar_t boot_classpath = "jre118/classes.zip";
#elif __JRE_VERSION == 150
static const pchar_t jvmdll = "jre150/bin/client/jvm.dll";
static const pchar_t boot_classpath = "jre150/classes.zip";
#elif __JRE_VERSION == 140
static const pchar_t jvmdll = "jre140/bin/client/jvm.dll";
static const pchar_t boot_classpath = "jre140/classes.zip";
#else
#error "invalid jre version (__JRE_VERSION)"
#endif

pchar_t JavaCoreVM::GetJvmDLL() { return jvmdll; }

void JavaCoreVM::Launch(
  pchar_t classpath,
  JavaXmsxSize memsize,
  ulong_t flags)
{
  if ( HMODULE hdll = LoadLibrary(jvmdll) )
  {
    if ( 0 == (*(FARPROC*)&JNI_CreateJavaVM_ = GetProcAddress(hdll,"JNI_CreateJavaVM")))
      throw WideException(
        _F(L"loading jvm error, '%?', JNI_CreateJavaVM")
          % jvmdll);
    if ( 0 == (*(FARPROC*)&JNI_GetDefaultJavaVMInitArgs_ = 
      GetProcAddress(hdll,"JNI_GetDefaultJavaVMInitArgs")))
        throw WideException(
          _F(L"loading jvm error, '%?', JNI_GetDefaultJavaVMInitArgs")
            % jvmdll);
  }
  else
    throw WideException(_F(L"loading jvm error, could not load module '%?'") % jvmdll);

  jre_verbose_ = flags & JRE_FLAGS_VERBOSE;

#if __JRE_VERSION < 120

  asciistring jre_classpath = boot_classpath;
  if ( classpath ) {
    if ( jre_classpath ) jre_classpath.Cat(";");
    jre_classpath.Cat(classpath); }

  JDK1_1InitArgs args1;
  memset(&args1,0,sizeof(args1));
  args1.version = 0x00010001;
  
  JNI_GetDefaultJavaVMInitArgs_(&args1);

  args1.minHeapSize = memsize.first * 1024*1024;
  args1.maxHeapSize = memsize.second * 1024*1024;
  
  args1.verbose        = ( flags & JRE_FLAGS_VERBOSE ) ? 1 : 0;
  args1.enableClassGC  = ( flags & JRE_FLAGS_VERBOSEGC ) ? 1 : 0;
  args1.disableAsyncGC = ( flags & JRE_FLAGS_NO_ASYNCGC ) ? 1 : 0;
  args1.enableClassGC  = ( flags & JRE_FLAGS_NO_GLASSGC ) ? 0 : 1;
  args1.classpath      = (char*)jre_classpath.Str();

  void* args = &args1;

#else // __JRE_VERSION >= 120
  
  std::vector<JavaVMOption> joptions;
  std::list<asciistring> buffers;

  { JavaVMOption& jo = *joptions.insert(joptions.end(),JavaVMOption());
    jo.optionString = 
      (char*)buffers.insert(buffers.end(),asciistring())
        ->SetF("-Djava.class.path=%s",classpath);
    jo.extraInfo = 0; }
  if ( flags & JRE_FLAGS_VERBOSE ) {
    JavaVMOption& jo = *joptions.insert(joptions.end(),JavaVMOption());
    jo.optionString = "-verbose";
    jo.extraInfo = 0; }
  if ( memsize.first != 0 ) {
    JavaVMOption& jo = *joptions.insert(joptions.end(),JavaVMOption());
    jo.optionString = 
      (char*)buffers.insert(buffers.end(),asciistring())
        ->SetF("-Xms%dm",memsize.first);
    jo.extraInfo = 0; }
  if ( memsize.second != 0 ) {
    JavaVMOption& jo = *joptions.insert(joptions.end(),JavaVMOption());
    jo.optionString = 
      (char*)buffers.insert(buffers.end(),asciistring())
      ->SetF("-Xmx%dm",memsize.second);
    jo.extraInfo = 0; }
#if !defined __JRE_DEFAULT_RUNTIME
  if ( boot_classpath != 0 ) {
    JavaVMOption& jo = *joptions.insert(joptions.end(),JavaVMOption());
    jo.optionString = 
      (char*)buffers.insert(buffers.end(),asciistring())
      ->SetF("-Xbootclasspath:%s",boot_classpath);
    jo.extraInfo = 0; }
#endif
  
  JavaVMInitArgs args2;
  memset(&args2, 0 , sizeof(args2));
  args2.version = JNI_VERSION_1_4;
  args2.ignoreUnrecognized = JNI_FALSE;
  args2.nOptions = joptions.size();
  args2.options  = &joptions[0];

  void* args = &args2;

#endif // __JRE_VERSION

  jint result;
  if ( JNI_OK != (result = JNI_CreateJavaVM_(&vm_,&env_,args)) )
    throw WideException(_F(L"creating jvm error, result code %?") % result);

  {if ( jclass_ref foo = env_->FindClass("java/lang/Object") )
    cls_object_ = (jclass)env_->NewGlobalRef(+foo);
    mid_object_tostring_ = env_->GetMethodID(cls_object_,"toString","()Ljava/lang/String;");
  }
  {if ( jclass_ref foo = env_->FindClass("java/lang/String") )
    cls_string_ = (jclass)env_->NewGlobalRef(+foo);}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.