2013-05-17 58 views
1

我想從OSGI包中的DLL中使用方法。該DLL在OSGI中正確加載,但我仍然得到一個java不滿意的鏈接錯誤,找不到本地方法!OSGI無法在運行時通過JNI鏈接到本機方法

當在Java中獨立部署(無OSGI)時,DLL將被加載並完美運行。

這裏就是我所做的:

  • 我產生了JNI橋到我的C++通過SWIG編譯DLL。
  • 我在調用swig時指定了包名。
  • 我在我的Maven pom.xml xml元素中聲明瞭dll包含,它生成了一個正確的Manifest文件。

    java.lang.UnsatisfiedLinkError: com.bmw.corona.components.sample.impl.generated.AdasDeconstructorJNI.swig_module_init()V

    的問題是耦合時:

  • 加載DLL庫是沒有任何錯誤/警告

什麼真正困擾我的是,在DLL中的符號似乎無法找到做它與OSGI,我猜在OSGI的ClassLoader的某處。

DLL中的方法似乎有一個正確的簽名:

_Java_com_bmw_corona_component[email protected]8

與生成的SWIG文件的原型如下:

SWIGEXPORT void JNICALL Java_AdasDeconstructorJNI_swig_1module_1init(JNIEnv *jenv, jclass jcls)

我三請務必檢查Manifest包含Bundle Native指令。

我在做什麼錯?

+1

你確定你有一個bundle本地頭......但不願意向我們展示它的外觀? ;-) –

回答

0

問題是雙重的。首先,沒有發現方法對Visual Studio 2010的方法名稱進行修改。我添加了一個鏈接指令:

#pragma comment(linker, "/EXPORT:__Java_com_bmw_corona_components_sample_impl_AdasDeconstructorJNI_swig_module_init=_Java_com_bmw_corona[email protected]8")

它需要一點時間,所有的包(超過100),以啓動和運行,並且我得到在發射後一java.lang.NullPointerException: null前幾秒鐘。之後,一切似乎都在正常工作。並且nullPointerException不見了..

0

你可能想諮詢這個wiki文章:http://wiki.osgi.org/wiki/Dependencies_In_Native_Code

這是很難從你的描述告訴我們,但它聽起來像是你有2個原生庫。一個帶有JNI入口點,另一個帶有真正的本機功能。以上wiki文章討論了從JNI本地庫到其他本地庫的依賴關係。

+0

我只有一個入口指向DLL,它是JNI入口點。從那裏,DLL符號會通過它們的Java簽名加載到虛擬機中。 Wiki對理解庫加載機制非常有幫助。但是,我在Windows上工作,這意味着將會查閱庫加載器緩存並在那裏找到DLL。 該dll _is_加載,但不知何故沒有訪問內部符號。 –

+0

(..我的意思是方法調用從dll中的抽象類到Java類中的implmenentations的簽名被加載到虛擬機中)。但是,讓我們不要複雜的東西,原始的入口點是JNI入口函數swig_module_init()。 –