需要帮助为JNI调用构建DLL。未解析的外部参考。 Borland编译器

时间:2012-04-01 00:06:53

标签: c++ dll linker java-native-interface c++builder

我需要构建一个DLL,然后可以从java程序加载JNI。去年我能做到这一点并且工作得很好。我正在尝试重新编译我的同一个.cpp文件,虽然我使用dll并且它失败了,因为包含的dll依赖项被引入。

我有一个c ++程序,它从这里的一些现有C ++代码调用大约5个函数。这些函数是巨大代码库的一部分,通常都链接在一起构建一组5个dll。

我使用依赖性walker查看我的dll,去年它编译时只有2个依赖系统dll被放入我的dll中。今天我正在尝试重新编译相同的dll,但如果我从包含我使用的函数的现有代码库中链接.lib文件,它会引入第三个dll文件。

基本上我知道如果我可以避免在我的程序中出现第3个dll,我的dll将与JNI一起正常工作。问题是我不知道如何在我的代码中从我们的代码中引用我需要的函数而不链接到lib文件。

我可以使用标准c ++文件和方法。当我从我们庞大的代码库中引用这个预先存在的代码时,才会出现此问题。

如果我没有将我的.obj文件与我们代码中的.lib文件链接,我将从我的Borland 5.5编译器中获取未解决的参考消息。

总体问题是,当我从c ++ exe文件中调用它时,我的dll文件工作正常,但Java无法处理其中的某些内容。此外,如果我将我的代码编译为unix而不是windows dll中的.so文件,Java JNI可以正常工作并加载它。我知道这个问题与Windows如何使用dll有关,我知道如果第三个dll没有加载作为我的dll的一部分,它也会工作。我只是不知道去年我做了什么来构建我的dll没有第三个显示为依赖。

如果我从现有代码中注释掉函数,那么它编译得很好并加载,因为第三个dll依赖项没有放入我的dll中。


更多细节

我收到了一条关于缺少_strcopy的消息,所以我在cw32mti.lib文件中链接并且消失了,但是后来cw32mti.dll显示在我的dll文件中。如何防止丢失参考消息,以防止它将dll放入我的dll?

我的链接命令如下所示。 ilink32 mydll.obj,mydll.dll ,, cw32mti

我得到其他缺少的引用工作的唯一方法是将另一个dll添加到我的链接命令,如: ilink32 mydll.obj,mydll.dll ,, cw32mti.lib other.lib

where.dll包含我从mydll.dll调用的函数,例如calculate(int a,int b),所以我的代码有一个像calculate一样的链接(num1,num2);问题是当我使用包含calculate方法的lib时,它还会引入其他链接到我不想加载的other.dll的dll。我需要能够调用calculate(num1,num2)而无需将other.dll添加到mydll.dll。这之前没有动态调用calculate并使用getprocaddress类型的编码。


更新 - 我最终不得不放弃让windows dll与smartheap内存管理器一起工作。由于此代码部署在unix中,因此我能够构建.so文件并使其与JNI一起使用。对于Windows DLL编译,我在JNI代码周围放置了一些条件编译器语句,导致加载了smartheap dll,因此当它在windows中编译时,它不会使用该代码。相反,我只是打印出一个声明,说它没有在Windows中执行。

我们后来遇到问题,让我们的64位JBoss服务器运行并加载这些32位.so文件。我最终运行了一个64位的并行JBoss服务器,并调用了引用32位JBoss实例上的32位库的方法。

它可能会演变得更晚,但是现在这个任务在经过几个月尝试许多不同的事情之后对我们有用。我感谢所有的帮助和输入。

1 个答案:

答案 0 :(得分:0)

如果您可以使用去年构建的应用程序DLL,请使用TDUMP查看模块依赖项。 (您可能必须分析所有DLL以获得良好的图片。)然后尝试在新DLL中重现,可能是通过调整链接器的配置.DEF文件。

如果您的问题中没有显示任何代码或.DEF文件,则很难更具体。