Javaアプリケーションに自分のネイティブライブラリをロードしたい。これらのネイティブライブラリは、サードパーティのライブラリに依存しています(アプリケーションがクライアントコンピューターにインストールされている場合は、存在する場合と存在しない場合があります)。
私のJavaアプリケーション内で、依存ライブラリの場所を指定するようにユーザーに依頼します。この情報を取得したら、それを使用して、JNIコードを使用して「LD_LIBRARY_PATH」環境変数を更新します。以下は、「LD_LIBRARY_PATH」環境変数を変更するために使用しているコードスニペットです。
Javaコード
public static final int setEnv(String key、String value){
if(key == null){
新しいNullPointerException( "キーをnullにすることはできません");をスローします。
}
if(value == null){
新しいNullPointerException( "値をnullにすることはできません");をスローします。
}
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);
(ジント)結果を返します。
}
また、環境変数をフェッチするための対応するネイティブメソッドもあります。
LD_LIBRARY_PATHを正常に更新できます(このアサーションはCルーチンの出力に基づいています)getenv()。
まだネイティブライブラリを読み込めません。依存するサードパーティライブラリはまだ検出されません。
ヘルプ/ポインタをいただければ幸いです。Linux64ビットを使用しています。
編集:
ダイナミックローダーが機能しているかどうかをテストするために、SSCE(C)を作成しました。これがSSCEです
#含む
#含む
#含む
#含む
int main(int argc、const char * const argv []){
const char * constdependentLibPath = "...:";
const char * const sharedLibrary = "...";
char * newLibPath = NULL;
char * originalLibPath = NULL;
int l1、l2、結果;
void*ハンドル=NULL;
originalLibPath = getenv( "LD_LIBRARY_PATH");
fprintf(stdout、 "\ n元のライブラリパス=%s \ n"、originalLibPath);
l1 = strlen(originalLibPath);
l2 = strlen(dependentLibPath);
newLibPath =(char *)malloc((l1 + l2)* sizeof(char));
strcpy(newLibPath、dependentLibPath);
strcat(newLibPath、originalLibPath);
fprintf(stdout、 "\ n新しいライブラリパス=%s \ n"、newLibPath);
結果=setenv( "LD_LIBRARY_PATH"、newLibPath、1);
if(result!= 0){
fprintf(stderr、 "\n環境を更新できませんでした\n");
exit(1);
}
newLibPath = getenv( "LD_LIBRARY_PATH");
fprintf(stdout、 "\ nenvからの新しいライブラリパス=%s \ n"、newLibPath);
ハンドル=dlopen(sharedLibrary、RTLD_NOW);
if(handle == NULL){
fprintf(stderr、 "\ n共有ライブラリを読み込めませんでした:%s \ n"、dlerror());
exit(1);
}
fprintf(stdout、 "\n共有ライブラリが正常にロードされました。\n");
結果=dlclose(handle);
if(result!= 0){
fprintf(stderr、 "\ n共有ライブラリをアンロードできませんでした:%s \ n"、dlerror());
exit(1);
}
0を返します。
}
Cコードも機能しません。どうやら、ダイナミックローダーはLD_LIBRARY_PATH環境変数を再読み込みしていません。ダイナミックローダーにLD_LIBRARY_PATH環境変数を再読み込みさせる方法を理解する必要があります。