[英]How to get rid of LD_PRELOAD when using JNI
我有JNI庫libA.so,它依賴於C庫libB.so.
在Java中,解決“符號查找錯誤”的一種方法是:
class A{
public native void g();
static{
System.load("/asdfghjk/libA.so");
}
}
然后運行java程序
LD_PRELOAD=libB.so
但是,這個hack不能在生產系統中使用,例如當使用Tomcat JSF部署程序時。
以下“解決方案”不起作用:
class A{
public native void g();
static{
System.load("/asdfghjk/libB.so");
System.load("/asdfghjk/libA.so");
}
}
它會產生錯誤:
symbol lookup error: /blah/... undefined symbol: _ZNblahblahblah...
該錯誤是因為找不到共享庫所依賴的庫。
您應該將依賴庫的位置添加到java.library.path
,首先以正確的順序顯式地System.load
它們,或者以某種方式使用dlopen
系統調用來加載依賴項。
這個問題可能會有所幫助: Java:加載具有依賴關系的共享庫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.