我使用JNI接口从C代码调用Java代码。 在编译时我使用以下命令:
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 / lib / amd64 / server / -ljvm calljava .C
我使用以下代码创建JVM:
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的路径是否在二进制文件中硬编码? 我们可以在运行时指定java可执行文件的路径吗? 如果有办法,那么任何人都可以帮助我使用可用于编译时的标志吗?
提前致谢!
答案 0 :(得分:1)
根本不使用“java可执行文件”。编译和链接代码时,将链接到共享库,共享库的位置由系统在运行时启动 可执行文件时确定。
除非您自己从已知位置动态加载jvm共享库(并随后查找并调用其中的函数),否则系统将确定“JVM的路径”。
通常,如果要针对特定版本运行,则应在应用程序的发行版中包含该版本,并配置应用程序的启动以确保使用正确的共享库(通过适当设置环境的脚本,动态加载它,或其他系统特定的方法)。