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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.