0
是否存在一種與平臺無關的方式來查找C語言中的JVM庫(Linux上的libjvm.so和Windows上的jvm.dll)的位置?C:以編程方式查找JVM庫文件位置
我試過使用libltdl API,它可以在一些(也許很多)平臺上工作,但它在Ubuntu上不起作用。
是否存在一種與平臺無關的方式來查找C語言中的JVM庫(Linux上的libjvm.so和Windows上的jvm.dll)的位置?C:以編程方式查找JVM庫文件位置
我試過使用libltdl API,它可以在一些(也許很多)平臺上工作,但它在Ubuntu上不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <ftw.h>
#include <string.h>
static char* jvm_lib_fpath;
static int check_file(const char *fpath, const struct stat *sb, int typeflag) {
static const char LINUX_LIB[] = "libjvm.so";
static const char WINDOWS_LIB[] = "jvm.dll";
const char *libs[] = {LINUX_LIB, WINDOWS_LIB};
int i;
for (i = 0; i < 2; i++) {
const char* lib = libs[i];
const size_t m = strlen(lib);
const size_t n = strlen(fpath) - m;
const char* test = &fpath[n];
if (strcmp(test, lib) == 0) {
const size_t fpath_len = strlen(fpath) + 1;
jvm_lib_fpath = (char*) malloc(fpath_len * sizeof(char));
if (jvm_lib_fpath == NULL) return -1;
strcpy(jvm_lib_fpath, fpath);
return 1;
}
}
return 0;
}
static int set_jvm_lib_fpath() {
char* java_home = getenv("JAVA_HOME");
int result = ftw(java_home, check_file, 128);
return result;
}
int main() {
int result = set_jvm_lib_fpath();
if (result == 1) {
printf("jvm_lib_fpath: '%s'\n", jvm_lib_fpath);
} else {
printf("Could not find JVM library file.\n");
}
if (jvm_lib_fpath) {
free(jvm_lib_fpath);
}
return 0;
}
雖然這是一個非常好的開始,但請記住,有些平臺已將Java正確集成到系統中,以便不需要將JAVA_HOME設置爲正確執行java,加載它的庫。爲了找到它,即使知道'java'的路徑也可能是開始的一步,因爲有'alternatives'系統。如果沒有JAVA_HOME或更明顯的方法,大部分自動檢測都會使用「可能」位置列表作爲最後的手段。 –