如何隔离平台特定的JNA绑定?【JAVA教程】

!
也想出现在这里? 联系我们
信息

如何隔离平台特定的JNA绑定?,第1张

概述如何隔离平台特定的JNA绑定

我有一个项目,我在其中定义了一个JNA包装到windows kernel32库,在这个库上我做了几个对项目不重要的帮助程序,但增加了与平台的集成(即:使用OutputDeBUGString + DeBUGVIEw和mailslot消息传递function)。

这是我的JNA定义:

import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import com.sun.jna.Native; import com.sun.jna.ptr.IntByReference; import com.sun.jna.win32.StdCalllibrary; import com.sun.jna.win32.W32APIFunctionMapper; import com.sun.jna.win32.W32APITypeMapper; public interface JnaKernel32 extends StdCalllibrary { //StdCall is needed for lib kernel32 @SuppressWarnings(\”unchecked\”) Map ASCII_OPTIONS = new HashMap(){ { put(OPTION_TYPE_MAPPER,W32APITypeMapper.ASCII); put(OPTION_FUNCTION_MAPPER,W32APIFunctionMapper.ASCII); } }; @SuppressWarnings(\”unchecked\”) Map UNICODE_OPTIONS = new HashMap(){ { put(OPTION_TYPE_MAPPER,W32APITypeMapper.UNICODE); put(OPTION_FUNCTION_MAPPER,W32APIFunctionMapper.UNICODE); } }; Map DEFAulT_OPTIONS = Boolean.getBoolean(\”w32.ascii\”) ? ASCII_OPTIONS : UNICODE_OPTIONS; JnaKernel32 INSTANCE = (JnaKernel32) Native.loadlibrary(\”kernel32\”,JnaKernel32.class,DEFAulT_OPTIONS); //some system defines //… }

和邮筒的定义:

public class mailslot { static JnaKernel32 kernel32 = JnaKernel32.INSTANCE; boolean localmailslot = false; int lastError = 0; private int hmailslot = JnaKernel32.INVALID_HANDLE_VALUE; //… }

而且在一些地方我也有

跨平台的windows脚本,linux,MacOS X

多平台软件的最佳语言

在linux上运行的Python脚本如何调用在Wine下运行的Python脚本的例程?

Perl模块在linux和Win32下运行

QtouchEvent而不是linux上的QMouseEvent

static JnaKernel32 kernel32 = JnaKernel32.INSTANCE; //to call OutputDeBUGString //… kernel32.OutputDeBUGString(\”some deBUG message\”);

我担心的是该项目也可以在GNU / linux或MacOS X上使用,但显然如果在OSX上执行,则Native.loadlibrary在运行时Native.loadlibrary失败。

我正在考虑

使用其他JNA绑定移植本机function

或者只是在另一个平台上运行时禁用现有的windows kernel32绑定,因为这只是方便而不是强制的帮助。

如何隔离特定于平台的function和调用? 我正在考虑将JNA部分移动到运行时加载的插件?

双模式执行可能吗?

有没有一个允许build立一个独立的可执行文件的Lua IDE?

编译为其他平台

在windows XP,Vista和7上安装了什么版本的.NET框架?

有没有办法在Glib v2.32 +中设置线程优先级?

答案实际上是一个通用的软件开发策略。

确定您的客户端代码需要的API

在这种情况下,它可能是MailsSlot.sendMessage(int destID,String msg)

抽象该API背后的实现细节

public interface mailslot { voID sendMessage(int destID,String msg); }

提供一个或多个具体实现来满足API合同

public class Win32mailslot implements mailslot { public voID sendMessage(int destID,String msg) { // Do stuff here that\’s windows-specific } }

public class OSXmailslot implements mailslot { public voID sendMessage(int destID,String msg) { // Do stuff here that\’s windows-specific } }

在运行时选择适当的实现:

mailslot mslot = Platform.IS_windows ? new Win32mailslot() : new OSXmailslot();

经过几次实现之后,您可能会发现一些重复的代码,然后您可能会重构成在特定于平台的实现中共享的抽象基类。

请参阅JNA平台的fileUtils类以获取此类策略的示例。

总结

以上是内存溢出为你收集整理的如何隔离平台特定的JNA绑定?全部内容,希望文章能够帮你解决如何隔离平台特定的JNA绑定?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞64 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容