我正在用C ++编写一些JNI代码,用于从Windows XP上的applet调用。我已经能够成功运行applet并加载和调用JNI库,甚至可以调用其他DLL中的函数。我通过设置PATH系统环境变量来包含我所有DLL所在的目录。
所以,问题是,我添加了另一个使用新外部DLL的调用,并且在加载库时突然抛出了UnsatisfiedLinkError。消息是:'找不到指定的过程'。这似乎不是一个缺少依赖DLL的问题,因为我可以删除一个从属DLL并获得有关从属DLL丢失的不同消息。从我在网上找到的内容来看,似乎这个消息意味着DLL中缺少本机Java函数实现,但奇怪的是它没有这些额外的代码就可以正常工作。
有谁知道可能导致这种情况的原因?什么类型的东西可以为UnsatisifedLinkError提供'找不到指定的过程'消息?
答案 0 :(得分:16)
我弄明白了这个问题。这真是太过分了。对于UnsatisfiedLinkError,“无法找到指定的过程”消息表示无法找到根dll或依赖dll 中的函数。在JNI情况下,最可能的原因是本机JNI函数未正确导出。但是,如果加载了依赖DLL并且该DLL缺少其父级所需的函数,则显然会发生这种情况。
举个例子,我们有一个名为input.dll的库。 DLL搜索顺序始终首先查看应用程序目录,最后查找PATH目录。过去,我们总是在与input.dll相同的目录中运行可执行文件。但是,Windows系统目录中有另一个input.dll(位于DLL搜索顺序的中间)。因此,当从Java applet运行它时,如果我在applet中包含上述代码,导致input.dll被加载,它将从系统目录加载input.dll。因为我们的代码期望input.dll中的某些函数不存在(因为它是一个不同的DLL),所以加载失败并显示有关缺少过程的错误消息。不是因为JNI函数导出错误,而是因为加载了错误的依赖DLL并且它没有预期的函数。
答案 1 :(得分:2)
DLL有可能是使用C ++构建的(而不是C)。除非你注意做一个关于程序的外部,这是一个可能的原因。
尝试从DLL导出所有函数。如果列表包含您的功能,那么您就是好的。
答案 2 :(得分:0)
通常,在链接到其他库时,您需要链接到相关的.lib文件。听起来你没有引用你需要的所有lib文件。检查未链接的内容,并确保将其lib添加到链接器列表中。
答案 3 :(得分:0)
您是否使用标准JNI程序创建了新的外部DLL?即,使用javah等等?如果是这样,那么我不确定是什么问题。
如果没有,那么您尝试调用的过程尚未导出(如anjanb所述)。我知道两种导出函数的方法:单独的导出列表和使用__declspec(dllexport)标记特定函数。
Can't access variable in C++ DLL from a C app提供了有关DLL主题的更多信息。
答案 4 :(得分:0)
在调试模式下编译c ++代码。然后插入DebugBreak();您要开始调试的语句。运行java代码。遇到DebugBreak()语句时,会弹出一个带有Debug按钮的弹出窗口。点击它。 Dev Studio将使用您的程序在机器代码中打开。使用调试器两次,您应该可以跳过源代码。
答案 5 :(得分:0)
如果您已经完成了JNI手册和示例中的所有编程问题,但仍然遇到相同的缺失过程错误,则问题可能出在您的路径变量上。执行以下步骤并再次运行:
执行这些步骤后,您的应用程序可以找到jni过程名称并以正确的方式链接到JNI.dll。所以,我希望你不要再次得到这个缺失的程序错误。