我有一个项目,我在其中定义了一个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绑定?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容