Я хочу загрузить свои собственные библиотеки в свое java-приложение. Эти собственные библиотеки зависят от сторонних библиотек (которые могут присутствовать или отсутствовать, когда мое приложение установлено на клиентском компьютере).
Внутри моего Java-приложения я прошу пользователя указать расположение зависимых библиотек. Получив эту информацию, я использую ее для обновления переменной среды «LD_LIBRARY_PATH» с помощью кода JNI. Ниже приведен фрагмент кода, который я использую для изменения переменной среды «LD_LIBRARY_PATH».
Java-код
public static final int setEnv(String key, String value) { if (key == null) { throw new NullPointerException("key cannot be null"); } if (value == null) { throw new NullPointerException("value cannot be null"); } return nativeSetEnv(key, value); } public static final native int nativeSetEnv(String key, String value);
Код JNI (C)
JNIEXPORT jint JNICALL Java_Test_nativeSetEnv(JNIEnv *env, jclass cls, jstring key, jstring value) { const char *nativeKey = NULL; const char *nativeValue = NULL; nativeKey = (*env)->GetStringUTFChars(env, key, NULL); nativeValue = (*env)->GetStringUTFChars(env, value, NULL); int result = setenv(nativeKey, nativeValue, 1); return (jint) result; }
У меня также есть соответствующие нативные методы для получения переменной среды.
Я могу успешно обновить LD_LIBRARY_PATH (это утверждение основано на выводе подпрограммы C getenv()
.
Я все еще не могу загрузить свою родную библиотеку. Зависимые сторонние библиотеки по-прежнему не обнаружены.
Любая помощь/указатели приветствуются. Я использую Linux 64 бит.
Редактировать:
Я написал SSCE (на C), чтобы проверить, работает ли динамический загрузчик. Вот это СССЭ.
#include #include #include #include int main(int argc, const char* const argv[]) { const char* const dependentLibPath = "...:"; const char* const sharedLibrary = "..."; char *newLibPath = NULL; char *originalLibPath = NULL; int l1, l2, result; void* handle = NULL; originalLibPath = getenv("LD_LIBRARY_PATH"); fprintf(stdout,"\nOriginal library path =%s\n",originalLibPath); l1 = strlen(originalLibPath); l2 = strlen(dependentLibPath); newLibPath = (char *)malloc((l1+l2)*sizeof(char)); strcpy(newLibPath,dependentLibPath); strcat(newLibPath,originalLibPath); fprintf(stdout,"\nNew library path =%s\n",newLibPath); result = setenv("LD_LIBRARY_PATH", newLibPath, 1); if(result!=0) { fprintf(stderr,"\nEnvironment could not be updated\n"); exit(1); } newLibPath = getenv("LD_LIBRARY_PATH"); fprintf(stdout,"\nNew library path from the env =%s\n",newLibPath); handle = dlopen(sharedLibrary, RTLD_NOW); if(handle==NULL) { fprintf(stderr,"\nCould not load the shared library: %s\n",dlerror()); exit(1); } fprintf(stdout,"\n The shared library was successfully loaded.\n"); result = dlclose(handle); if(result!=0) { fprintf(stderr,"\nCould not unload the shared library: %s\n",dlerror()); exit(1); } return 0; }
Код C также не работает. Судя по всему, динамический загрузчик не перечитывает переменную окружения LD_LIBRARY_PATH. Мне нужно выяснить, как заставить динамический загрузчик перечитать переменную среды LD_LIBRARY_PATH.