我创建了一个C++模块来构建一个共享库文件,然后使用JNI从Java调用它.
我有两个环境,Windows和Unix,我有一个C++可执行程序和一个Java程序,我只是为每个环境重新编译.
当我在Windows中编译tester.exe程序并使用我的库(.dll)中的方法运行它时,它工作正常.就像unix版本一样.
当我在Windows中编译我的Java程序并使用Java的loadLibrary加载我的库(.dll)时,它失败了.它说尝试访问无效地址.
我无法弄清楚为什么它在Windows中运行时无法使用Java loadLibrary,但它可以在其他地方使用相同的代码.如果我延迟加载我的库使用的依赖DLL,那么我的库在Java中加载但不起作用.我知道有一些特定的代码导致Java加载我的库的问题,但我无法弄清楚为什么我的C++ exe对相同的方法和库没有问题.
我的dll有一个公开的方法,它从一些现有的库中调用4个方法.如果我评论这4个方法,那么我的DLL加载Java很好.我知道这与我的dll链接到的库中的这些方法有关.Java是如何看待依赖库的?我首先尝试加载依赖库,但是我加载的一个dll文件导致递归错误并且堆栈溢出.
任何人都知道一种方法导致堆栈从递归错误溢出?我需要其中的方法,但我不能用java loadLibrary加载它.
以下是有关所涉及文件和实际错误消息的更多详细信息.我在我的inital dll文件中添加了一个DllMain,只是为了看看什么载荷和什么时候.如果我将同一个程序(my_plain_dll_to_call_JNI_DLL)编译为exe文件,一切正常.如果我编译它并从我的java程序加载它会发生这种情况.
我写了文件名,显示每行左边的文本,以显示执行所在的层.
c:\java myJavaProgram
myJavaProgram: Java Static Method Entry.
myJavaProgram: Java Calling System.loadLibrary(my_plain_dll_to_call_JNI_DLL)
my_JNI_DLL.dll: Entering DllMain
my_JNI_DLL.dll: DLL_PROCESS_ATTACH
my_plain_dll_to_call_JNI_DLL: DLL_PROCESS_ATTACH
my_plain_dll_to_call_JNI_DLL: DLL_THREAD_ATTACH
my_plain_dll_to_call_JNI_DLL: DLL_THREAD_DETACH
my_plain_dll_to_call_JNI_DLL: DLL_PROCESS_DETACH
myJavaProgram: my_plain_dll_to_call_JNI_DLL Loaded!
myJavaProgram: Java Static Method Exit.
myJavaProgram: Entering Main().
my_plain_dll_to_call_JNI_DLL: In call_my_JNI_DLL_method
my_JNI_DLL.dll: In my_JNI_DLL_method
my_JNI_DLL.dll: Entering my_JNI_DLL_CheckEnvironmentVariables()
my_JNI_DLL.dll: Exiting my_JNI_DLL_CheckEnvironmentVariables
my_JNI_DLL.dll: Calling StartExistingNativeCode.
#
# A fatal error has been detected by the Java Runtime …Run Code Online (Sandbox Code Playgroud)