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

Need help building a DLL for JNI call. Unresolved external references. Borland Compiler

本文关键字:外部 引用 编译器 Borland DLL 帮助 JNI 构建 调用      更新时间:2023-10-16

我需要构建一个DLL,然后可以从java程序中用JNI加载该DLL。我去年能够做到这一点,而且效果很好。我现在正试图重新编译我的相同.cpp文件,尽管我用它创建dll,但由于引入了一个包含的dll依赖项,它失败了。

我有一个c++程序,它从一些现有的c++代码中调用了大约5个函数。这些函数是一个庞大的代码库的一部分,通常将它们链接在一起以构建一组5个dll。

我使用依赖助行器来查看我的dll,去年它只编译了2个依赖系统的dll。今天,我试图重新编译同一个dll,但如果我链接到包含我使用的函数的现有代码库中的.lib文件,它会带来第三个dll文件。

基本上,我知道如果我能避免第三个dll出现在我的程序中,我的dll将与JNI一起工作。问题是,如果不链接到lib文件,我不知道如何从现有的代码库中引用代码中所需的函数。

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

如果我不将我的.obj文件与代码中的.lib文件链接,我将从我必须使用的Borland 5.5编译器中获得未解析的引用消息。

总的问题是,当我从c++exe文件调用dll文件时,它可以正常工作,但Java无法处理其中的某些内容。此外,如果我在unix中将代码编译成.so文件而不是windows dll,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

其中other.dll包含我从mydll.dll调用的函数,如calculate(int a,int b),所以我的代码中有一个链接,类似于calcule(num1,num2);问题是,当我使用包含计算方法的lib时,它还会引入链接到我不想加载的other.dll的其他dll。我需要能够在不将other.dll添加到mydll.dll的情况下调用calculate(num1,num2)。这在以前没有动态调用calcule和使用getprocaddress类型的编码的情况下起作用。


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

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

它可能会在以后演变成更多,但在经历了几个月的尝试之后,目前这项任务正在为我们工作。我感谢大家在这里提供的帮助和意见。

如果您可以获得去年构建的应用程序DLL,请使用TDUMP查看模块依赖关系。(你可能需要分析所有的DLL才能得到一个好的图片。)然后尝试在新的DLL中复制它,可能是通过调整链接器的配置.DEF文件。

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