2013-07-22 2 views
0

Я использую интерфейс JNI для вызова кода Java из кода C. При компиляции я использую следующую команду:Вызов кода Java из C

gcc -g -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/-I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/linux/-L/usr/bin/java -L/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/Библиотека/amd64/сервер/-ljvm calljava.c

И я использую следующий код для создания виртуальной машины Java:

JNIEnv* create_vm() 
{ 
    JavaVM* jvm; 
    JNIEnv* env; 
    JavaVMInitArgs args; 
    JavaVMOption options[1]; 
    args.version = JNI_VERSION_1_2; 
    args.nOptions = 1; 
    options[0].optionString = "-Djava.class.path=<classpath>"; 
    args.options = options; 
    args.ignoreUnrecognized = JNI_FALSE; 
    JNI_CreateJavaVM(&jvm, (void **)&env, &args); 
    return env; 
} 

Мой вопрос: ли путь к JVM HARDCODED в двоичном? Можно ли указать путь к исполняемому файлу java во время выполнения? Если есть способ сделать это, кто-нибудь может мне помочь с флагами времени компиляции, которые могут быть использованы для этого?

Заранее благодарен!

ответ

1

«java executable» не используется вообще. Когда вы компилируете и связываете свой код, вы связываетесь с общей библиотекой, местоположение которой определяется системой во время выполнения при запуске вашего исполняемого файла.

Если вы не динамически загружаете отдельную библиотеку jvm из известного местоположения (а затем просматриваете и вызываете функции там), система будет определять «путь к JVM».

Обычно, если вы хотите запускать определенную версию, вы должны включить эту версию в дистрибутив приложения и настроить запуск своего приложения, чтобы убедиться, что используется соответствующая общая библиотека (либо через скрипты, которые соответствующим образом устанавливают среду , динамическая загрузка его или другие системные методы).

Смежные вопросы