当前位置: 首页 > 知识库问答 >
问题:

使用JNA并行调用不可重入的本机函数

施凡
2023-03-14

我想并行化对不可重入的本机库(DLL)的调用。两个线程应该并行调用本机函数。我想使用JNA访问DLL。锁不是解决方案,因为这不是并行性。

我至今的想法是:

>

  • 线程池,其中线程将每个代理实例保存到加载了本机的DLL。loadLibrary()

    线程池,每个线程将一个代理实例保存到具有不同名称的自己的物理DLL。每个都加载了N个ative.load库()。(它可能只有在相同的库接口,可以加载多个DLL)

    是否需要在不同的JVM中加载DLL以实现并行。

    有人知道这些想法中的一个是否可行/或者为什么不可行吗。其他建议?谢谢,马丁

  • 共有1个答案

    赵俊远
    2023-03-14

    在Windows上,不能将同一DLL两次加载到一个进程中。我认为实现并行性的最佳选择是让多个进程同时执行,而不是一个进程。

     类似资料:
    • 问题内容: 与JNI相比,JNA似乎更易于调用本机代码。在什么情况下,您将在JNA上使用JNI? 问题答案: JNA不支持c 类的映射,因此,如果您使用的是c 库,则需要一个jni包装器 如果需要大量内存复制。例如,您调用一个返回大字节缓冲区的方法,对其中的内容进行更改,然后需要调用使用此字节缓冲区的另一种方法。这将需要您将该缓冲区从c复制到java,然后再将其从java复制回到c。在这种情况下,

    • 我想用Java将一个文件放入Windows中的回收站。以便用户能够还原它。

    • 我有一些Java代码,它使用JNA调用一些本机代码,这些代码最初是用Fortran编写的。(这是一个数字库,许多数学工作者用Fortran编写代码。)它被编译成库,请参见以下内容: Fortran:https://github.com/mizzao/libmao/tree/master/src/main/fortran 在代码中进行单元测试时,我得到了很好的结果,但后来我尝试使用多线程的代码,结果

    • 问题内容: 我正在尝试编写一些通过JNA执行等待的代码(例如,通过调用Kernel32函数WaitForSingleObject),但是如果调用Thread.interrupt(),我也希望等待完成。我假设Java使用Event对象之类的东西来实现中断;有什么办法可以从Java获取事件,以便在对WaitForMultipleObjects的调用中使用它?或者如果线程被中断,还有其他方法可以安排等待

    • 线程“main”java.lang.UnsatifiedLinkError:查找函数“StartConector”时出错:找不到指定的过程。在com.sun.jna.function.(function.java:179)在com.sun.jna.nativelibrary.getfunction(nativelibrary.java:350)在com.sun.jna.nativelibrary.

    • 问题内容: 我正在从Java程序的Delphi编译的* .so文件中调用函数。经过研究后,JNA似乎是他的路要走。在深入研究一些复杂的Delphi代码之前,我尝试使用一些“ Hello World”代码,但是在获取由Delphi函数返回的字符串时遇到了麻烦。 Delphi代码(helloworld.pp): 我从命令行使用“ fpc -Mdelphi helloworld.pp ” 编译它,生成