這是我的問題。更新後的DLL導致JNI拋出「Exception c0000005」
我有第三部分DLL(我沒有源代碼),我必須使用JNI來交談。提供此DLL的人不是Java-house。我在他們的DLL中發現了一個錯誤,所以編寫了一些C++,它們運行了它們的DLL,暴露了這個錯誤並將它發送給他們以進行修復。我終於從他們那裏得到了一個更新的DLL,運行了我的C++代碼(它工作正常),並發現bug確實已經修復。然而,現在當我在我的JNI代碼中使用這個新的DLL時,我得到了下面的異常:
Exception c0000005, at 1EEE3416
Access violation: attempting to read memory at address 00000004
Native function stack data: 0,3f49c0,20201,801c6,65637845,6f697470,3063206e,30303030
com.jniwrapper.FunctionExecutionException: c0000005
at com.jniwrapper.Function.invokeCFunc(Native Method)
at com.jniwrapper.FunctionCall.a(SourceFile:127)
at com.jniwrapper.FunctionCall.call(SourceFile:35)
at com.jniwrapper.Function.invoke(SourceFile:188)
at com.tme.techdoc3.diagnostic.api.denso.DensoApiInvoker.invoke(DensoApiInvoker.java:78)
at com.tme.techdoc3.diagnostic.api.denso.NewDensoApi.invoke(NewDensoApi.java:106)
at com.tme.techdoc3.diagnostic.api.denso.NewDensoApi.connect(NewDensoApi.java:46)
at ConsoleApiRunner.main(ConsoleApiRunner.java:59)
我實際使用JNIWrapper提供本人JNI代碼等來了統治他們的產品爲引起我寫我自己的JNI代碼,而不是一個問題;但我仍然得到這個相同的錯誤。這使我確信問題出在第三方DLL中。
我從我調用DLL的第一個函數(順便說一句,這個函數沒有它的bug ...)得到這個異常。
我們得到DLL的地方明確表示,他們不會支持它在JNI環境中的使用,即使他們不會向我發送任何類型的發行說明或固定和非固定鏈接之間的更改列表,固定的DLL。
在政治上,我無能爲力。實際上,我僅限於該供應商的DLL。
任何人都可以想到任何理由爲什麼這個DLL從C++調用時會起作用,但不是在JNI中調用時?我一直在玩JNI堆棧大小(-Xss)和其他一些JVM參數,但是我沒有選擇正確的設置,或者我看錯了。
任何想法,不勝感激。
非常感謝。
編輯:添加我自己的JNI代碼,看看是否有人可以發現一個錯誤。
編輯2:更正後的代碼複製粘貼錯誤。
當我使用我自己的JNI代碼時,下面是我正在使用的.cpp文件的實現;你可以看到,這很簡單,當我把指針等混在一起時,我看不到任何地方。 (免責聲明:這幾乎是我C++技能的總和!)
是的,糟糕的指針是我一直在網上閱讀的東西。麻煩的是,我無法將這一事實融入我所看到的代碼中。就像我說的那樣,直接從C++調用這個DLL工作正常,所以這意味着DLL本身沒問題,不是嗎? 所以你是對的,問題必須在JNI代碼中。但是,使用這個JNIWrapper產品並將老版本的DLL交換回來工作正常,但只要我交換到新版本,就會出現此錯誤 - 這意味着問題出在DLL中? – Tom 2010-08-04 15:04:44
新的DLL可能正常工作,但性能或內存配置文件略有不同。這可能足以暴露先前隱藏的java/jni代碼中的錯誤。你可以試着挑起C++中的失敗,讓你知道在哪裏尋找。 – morechilli 2010-08-04 15:14:05
是的你是對的。可悲的是,這是一個複製粘貼錯誤,而不是其他任何東西。 我已經有很多C++代碼在沒有任何問題的情況下運行第三方DLL,我可能會嘗試再次嘗試並嘗試使其失敗。 – Tom 2010-08-05 07:36:45