Можно ли скомпилированный бинарный java-файл запустить с помощью С++? Без system
!
Вы можете использовать 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;
}
Приблизительно вот так:
#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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хочу создать андроид приложения для сайта, сайт не мойПриложение будет парсить необходимые данные с сайта и предоставлять пользователю,...
Пытаюсь писать свою малюсенькую программу и одна из основ - это написание метода, в котором пользователь делает выбор в меню с помощью вводы...