Tag: jna

从多个Java线程调用不可重入的本机共享库

我有一些Java代码调用一些本机代码,最初是用Fortran编写的,使用JNA。 (这是一个数值库,很多数学人员都在Fortran中进行编码。)它被编译成.so库,见下文: Fortran: https : //github.com/mizzao/libmao/tree/master/src/main/fortran Java绑定: https : //github.com/mizzao/libmao/blob/master/src/main/java/net/andrewmao/probability/MvnPackDirect.java 在我的代码中测试了所有单元,我得到了很好的结果,但后来我尝试使用来自多个线程的代码,一切都开始失败并出现奇怪的错误。 然后,我研究了一些关于重入Fortran代码的东西,并意识到我使用的库具有相当于一些全局变量(Fortran中的SAVE关键字,它记住了再次调用函数时变量的值: fortran SAVE语句 ) 现在我正在使用synchronized块包装对库的调用,但这显着地阻碍了性能。 在我看来,重新设计库是可重入的需要付出很大的努力(它有几千行数字代码,并且不清楚当子程序运行时值如何延续。)有谁知道解决问题的最佳方法是什么? 我的想象力表明…… 有没有办法让每个Java线程在内存中加载共享库的单独副本,以便全局变量实际上是线程本地的? 这有可能吗? 我不确定JNA的直接绑定或库绑定是如何工作的,如果有办法以这种方式使用它。 即使从不同的VM调用它,它仍然会被搞砸吗? 我该如何检查以确定? 有没有办法让gfortran ( gcc )以可重入的方式编译Fortran代码? 是否有一些快速而肮脏的方法使Fortran代码可以重入? 我搜索了RECURSIVE关键字,它显然将变量保存在堆栈中,但这似乎与现有代码不兼容。 还有其他可能的解决方 我确认多个虚拟机可以正常运行; 这是有道理的,因为他们不共享记忆。 仍然是一个PITA,但比线程更不方便。

如何在Java中使用JNA lib使用C#函数

我花了很多时间尝试在我的Java应用程序中使用C#函数但没有成功……我在C#中编写了以下lib: public class Converter { public Converter() { } public bool ConvertHtmlToPdf(String directoryPath) { //DO SOMETHING } } 这个dll调用另一个dll进行一些操作,但是当我编译它时,我可以在我的Realse文件夹中找到Dlls,一切似乎都没问题,所以我使用32位选项,64位和任何CPU选项编译它只是为了确保它不是我的问题。 使用Dependency Walker在32位和任何CPU选项中分析我的dll文件,它说IESHIMS.DLL无法找到,并显示以下消息: 警告:找不到至少一个延迟加载依赖项模块。 警告:由于延迟加载相关模块中缺少导出function,至少有一个模块具有未解析的导入。 64位文件没有出现,但我找不到我的ConvertHtmlToPdf函数。 由于我不知道它是否相关,我的第二步是在Java代码中。 要加载我的库我做: System.setProperty(“jna.library.path”, “C:\\Program Files (x86)\\Facilit\\Target App\\lib”); 和: public interface IConversorLibrary extends Library { IConversorLibrary INSTANCE = (IConversorLibrary) Native.loadLibrary(“converter”, IConversorLibrary.class); void ConvertHtmlToPdf(String directoryPath); } (lib似乎加载成功,因为如果我尝试删除运行它的应用程序的dll文件,说它无法删除,因为它正在使用),最后: IConversorLibrary.INSTANCE.ConvertHtmlToPdf(directoryPath); 但结果并非如我所愿: java.lang.UnsatisfiedLinkError: Error looking up […]

Java:使用依赖项加载共享库

我使用JNA用Java包装共享库(用C语言编写)。 共享库是内部编写的,但该库使用来自另一个外部库的函数,该库再次依赖于另一个外部库。 所以情况是这样的: ext1 < – ext2 < – 内部 即内部使用外部库ext2,它再次使用外部库ext1。 我试过的是: System.loadLibrary(“ext1”); System.loadLibrary(“ext2”); NativeLIbrary.loadLibrary(“internal”,xxx.class); 加载库“ext2”时,此方法失败并显示“UnresolvedException”; 链接器抱怨确实存在于库“ext1”中的符号。 所以它认为System.loadLibrary()函数不会使“ext1”中的符号全局可用? 当使用stdlib函数dlopen()时: handle = dlopen( lib_name , RTLD_GLOBAL ); 在@lib_name中找到的所有符号都可用于后续加载中的符号解析; 我想我喜欢的东西类似于java品种System.loadLibrary()? 问候 – Joakim Hove

无法在Java / C ++中为外部应用程序设置always-on-top

我正在寻找解决方案,使外部应用程序(不是像记事本或calc.exe这样的Windows应用程序)在Java GUI中按下按钮后始终保持在顶部。 我在C ++中使用此代码来获取桌面上所有打开的窗口并将其进程ID(PID)与已发送的PID(来自我在Java中的应用程序)相匹配: #include “cjni.h” #include #include #include using namespace std; BOOL CALLBACK EnumWindowsProc(HWND windowHandle, LPARAM lParam){ DWORD searchedProcessId = (DWORD)lParam; DWORD windowProcessId = 0; GetWindowThreadProcessId(windowHandle, &windowProcessId); printf(“process id=%d\n”, windowProcessId); if(searchedProcessId == windowProcessId) { HWND hwnd = windowHandle; SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); printf(“Process ID found !”); return FALSE; } return TRUE; […]

关闭捕获全局输入事件的钩子

介绍 这是一个说明问题的例子。 考虑我正在跟踪并显示鼠标全局当前位置和最后点击按钮并定位给用户。 这是一张图片: 要在Windows框中存档捕获点击事件,将会发送到其他程序事件消息队列,我使用winapi即user32.dll库创建一个钩子。 这是在JDK沙箱之外,所以我使用JNA来调用本机库。 这一切都很完美,但它没有像我期望的那样关闭。 我的问题是 – 如何正确关闭以下示例程序? 示例来源 下面的代码不是由我完整编写的,而是在Oracle论坛中从这个问题中获取并部分修复。 import java.awt.AWTException; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.MouseInfo; import java.awt.Point; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JLabel; import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Platform; import com.sun.jna.Structure; import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR; import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinDef.LRESULT; import com.sun.jna.platform.win32.WinDef.WPARAM; import com.sun.jna.platform.win32.WinUser.HHOOK; import […]

我如何使用JNA映射此Delphi函数

我有以下Delphi函数: function DoX(const InputBuffer: Pointer; const InputBufferSize: longword; OutputBuffer: Pointer; var OutputBufferSize: longword): longbool; OutputBuffer和OutputBufferSize将作为结果的一部分在函数中设置,并使用布尔返回来指示方法是否成功(InputBuffer和OutputBuffer将是字节数组)。 我已经设法从dll映射我的一些所需的function与JNA,他们工作正常,但这一个给我的问题,任何帮助将不胜感激。

Java中的虚拟操纵杆

您是否听说过具有Java包装的Windows虚拟操纵杆? 我正在尝试PPJOY,它工作得很好,但后来我需要使用JNI来使它从Java工作,而且暂时看起来并不容易。 谢谢!

JNA内存访问无效未知接口

我尝试了一切,但它总是返回一个无效的内存访问期望这是c函数: HRESULT GetImage( SIZE size, SIIGBF flags, HBITMAP *phbm ); 这可能是java实现: WinUser.SIZE size = new WinUser.SIZE(64,64); WinDef.HBITMAP bitmap = new WinDef.HBITMAP(); factory.GetImage(size,0,bitmap); 这是IShellItemImageFactory类: package main; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.COM.Unknown; import com.sun.jna.platform.win32.WinDef; import com.sun.jna.platform.win32.WinNT; import com.sun.jna.platform.win32.WinUser; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; /** * Created by Marcel on Aug,2018 */ public class IShellItemImageFactory extends Unknown { public IShellItemImageFactory(Pointer […]

如何使用JNA回调

我正在使用JNA来调用dll文件的函数。 simpleDLL.h: typedef int (__stdcall *eventCallback)(unsigned int id, int value); namespace test { class hotas { public: static __declspec(dllexport) int readValue(int a); static __declspec(dllexport) void setCallback(eventCallback evnHnd); }; } simpleDLL.cpp: #include “simpleDLL.h” #include using namespace std; namespace test { eventCallback callback1 = NULL; int test::readValue(int a) { return 2*a; } void test::setCallback(eventCallback evnHnd) { callback1 […]

使用Java本机访问更改MAC系统的桌面背景

我有一个代码片段来使用JNA更改系统桌面,它对我来说很好。 我需要做什么改变才能使用Mac Os上的代码。 非常感谢帮助。 谢谢,谢哈布。