Вы опубликовали то же решение, что и я. Мы стараемся не делать этого.

у загрузить свои собственные нативные библиотеки в моем 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 (это утверждение основано на выводе процедуры Cgetenv().

Я все еще не могу загрузить свою родную библиотеку. Зависимые сторонние библиотеки до сих пор не обнаружены.

Любая помощь / указатели приветствуются. Я использую 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.

Ответы на вопрос(1)

Ваш ответ на вопрос