Запустить джава файл с помощью с++

156
19 января 2019, 14:40

Можно ли скомпилированный бинарный java-файл запустить с помощью С++? Без system!

Answer 1

Вы можете использовать JNI для запуска виртуальной машины из вашего кода:

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
void error(char* msg) {
    fprintf(stderr, msg);
    exit(1);
}
int main() {
    JavaVM *vm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
    options[0].optionString = "-Djava.class.path=.";
    vm_args.version = JNI_VERSION_1_8;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = 1;
    // Запуск виртуальной машины
    jint res = JNI_CreateJavaVM(&vm, (void **) &env, &vm_args);
    if (res < 0) {
        error("Can't create JVM\n");
    }
    // Загрузка класса HelloWorld.class из текущего каталога
    jclass mainCls = (*env)->FindClass(env, "HelloWorld");
    if (mainCls == NULL) {
        error("HelloWorld class not found\n");
    }
    // Получение метода static void main(String[] args)
    jmethodID method = (*env)->GetStaticMethodID(env, mainCls, "main", "([Ljava/lang/String;)V");
    if (method == NULL) {
        error("main() method not found\n");
    }
    // Создание строкового массива аргументов
    jclass strCls = (*env)->FindClass(env, "java/lang/String");
    jobjectArray args = (*env)->NewObjectArray(env, 0, strCls, NULL);
    if (args == NULL) {
        error("Out of memory\n");
    }
    // Вызов HelloWorld.main()
    (*env)->CallStaticVoidMethod(env, mainCls, method, args);
    // Завершение работы виртуальной машины
    (*vm)->DestroyJavaVM(vm);
    return 0;
}
Answer 2

Приблизительно вот так:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
    int rc;
    char *new_argv[] = {"java", "-jar", argv[1], NULL};
    // Аргумент команандной строки(имя файла jar) передаём интерпретатору java
    if (argc != 2) {
        printf("введите команду: %s <Имя jar файла>\n", argv[0]);
        exit(-1);
    }
    rc =  execvp("java", new_argv);
    // Здесь мы не должны никогда оказаться
    printf("Ошибка при вызове exexvp\n");
}

Я запускаю свой MIB-браузер, расположенный в каталоге /usr/local/bin/mibbrowser/lib/ вот таким образом:

gcc main.c
./a.out /usr/local/bin/mibbrowser/lib/browser.jar
READ ALSO
Как авторизоваться на чужом сайте через android приложение?

Как авторизоваться на чужом сайте через android приложение?

Хочу создать андроид приложения для сайта, сайт не мойПриложение будет парсить необходимые данные с сайта и предоставлять пользователю,...

171
Как сделать функцию дозагрузки файла

Как сделать функцию дозагрузки файла

Скачиваю файл таким образом:

167
Проверка вводимого знака через консоль

Проверка вводимого знака через консоль

Пытаюсь писать свою малюсенькую программу и одна из основ - это написание метода, в котором пользователь делает выбор в меню с помощью вводы...

151