知识大全 运用JNA保护你的遗留代码(二)

Posted

篇首语:究竟什么是真理?——不可驳倒的谬误便是。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 运用JNA保护你的遗留代码(二)相关的知识,希望对你有一定的参考价值。

运用JNA保护你的遗留代码(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  从Java中引用DLL代码

  列表四演示代码引用DLL函数

         public interface CLibrary extends Library

  CLibrary INSTANCE = (CLibrary)

  Native loadLibrary((Platform isWindows() ? nativecode : c )

  CLibrary class);

  int helloWorld(int divider);

  

  public static void main(String[] args)

  CLibrary INSTANCE helloWorld( ));

  

  列表四 访问DLL函数

  在列表四中 CLibrary实例被创建 这个对象允许指定的DLL被下载 接下来 是库的装入过程 标志需要从库中标记——在列表四的实例中 只有一个标志 被称为helloWorld()

  列表五演示的程序来自列表四的代码

        C:\\jnacode>java HelloWorld

  Value is

  列表五 调用的DLL的代码

  在列表五中没有什么好惊奇的——值 获准进入函数 紧接着在函数内部 参数( )被 除 得出答案

  当我尝试着着手解决DLL的问题 与调用约定联系起来 我想看看生成DLL的过程 幸运的是 你可以通过一种工具实现这个愿望 这个工具被称为Dependency Walker 通过Dependency Walker你可以看到DLL的生成过程 为了实现 你需要下载一个免费的Dependency Walker副本 打开 然后把DLL装载在里面 你就可以看见如图一所示的类似内容

  

  图一 DLL内部信息

  注意图一中的函数名称 这些函数名称与DLL标志helloWorld()相匹配 如果当你创建一个DLL的时候 使用标准调用约定 函数名称将会如图 所示

  

  图 标准调用约定

  注意函数名称变化的方式 现在 如果你尝试运行Java程序 将会得到令人厌烦的错误提示 如列表六所示

         C:\\jnacode>java HelloWorld

  Exception in thread main java lang UnsatisfiedLinkError: Error looking up function helloWorld : The specified procedure could not be found

  at sun jna Function (Function java: )

  at sun jna NativeLibrary getFunction(NativeLibrary java: )

  at sun jna Library$Handler invoke(Library java: )

  at $Proxy helloWorld(Unknown Source)

  at HelloWorld main(HelloWorld java: )

  列表六 连接器错误

  包括上面的错误情况 因为我自己也突然遇到了以上情形 所以 这是一个完全的JNA现场演示案例 这与JNI是如何联系的——JNA的前身?

  JNI 不是今天 谢谢!

  我经常想到 这些年来JNI承受了很多评论 在很多实例中 一个软件支持部门要做的第一件事情就是说 你使用JNI吗? 如果答案是肯定的 然后在很多例子中 没有接踵而来的支持 另一方面 在很多顾问工作中 我看见很多JNI案例 这些JNI案例在大型Java和C++代码基础之间使用 在这样一种情况中 Java和C++通过所有的单元 结合测试 但是生产出来的代码随时有崩溃的可能性 这种情况下 Java和C++程序员尝试着掩饰这种情况 每个人都在指责对方

  解决JNI的悲哀的一个比较好的方案是通过一系列清单项目运行 这些在任何一边的清单项目都是为了代码 举个例子 在C这边的代码

  · 一个数组边界被突破?

  · 一个空指针被取消引用?

  · 动态内存被正确的分配?

  JNA有可能结束这种类型情况

  库许可问题?

  JNA令人感兴趣的是它开启了Java直接存储DLL代码的功能 它也适用于其它的库技术 比如共享的Unix库 软件组成部分得到许可的意思是什么?JNA的使用也许是令人信服的 可以用来存取Java中的许可的库代码 另一方面是JNA代码可以允许存取安全限制库代码

  除了上面所考虑的问题 具有存取遗留代码的能力也是很重要的 现在让我们来看一看

  当遗留代码调用通过JNA报错时

  回顾列表三中的代码 除一个参数使之成为一个不变值 如果我把 设置为除数 执行操作的时候会发生什么那?

         public interface CLibrary extends Library

  CLibrary INSTANCE = (CLibrary)

  Native loadLibrary((Platform isWindows() ? nativecode : c )

  CLibrary class);

  int helloWorld(int divider);

  

  public static void main(String[] args)

  CLibrary INSTANCE helloWorld( ));

  System out println( Value: + CLibrary INSTANCE helloWorld( ));

  

  列表 把 设置为除数的情况

  当我执行列表七中的代码 我将会得到如列表八所示的输出示意

         C:\\jna_article\\jnacode>java HelloWorld

  Value is

  #

  # An unexpected error has been detected by HotSpot Virtual Machine:

  #

  # EXCEPTION_INT_DIVIDE_BY_ZERO ( xc ) at pc= x b pid= tid=

  

  #

  # Java VM: Java HotSpot(TM) Client VM ( _ b mixed mode)

  # Problematic frame:

  # C [nativecode dll+ x ]

  #

  # An error report file with more information is saved as hs_err_pid log

  #

  # If you would like to submit a bug report please visit:

  #

  列表 障碍 除数为 的意外情况

  这可不漂亮 但是我们还是得到了一些结果 无论如何 在现实生活中是线性增长的例子 想像一下 尝试在一个大的代码库中查找的状况 总的来说 JNA是很强大的 但是就像任何强大的事情一样 它还需要责任感

  运行提供的代码以及CLASSPATH事务

  伴随着JNA 对此进行安排并且运行并不是十分困难——确认你跟随了一些简单的指导方针 我已经实现了自己定制的DLL 并且编辑Java代码作为源代码的一部分 Zip文件 你需要确定这些代码可以在Windows XP上面运行 不需要编辑其它什么部件

  运行代码 解压源文件到一个文件夹 比如C:\\jnacode 接下来的步骤是可选择的 因为源文件包含一个jna jar 副本 如果你打算拥有自己的jna jar 副本 或者一个新的发布版本 然后再下载jna jar 文件的副本 为了使事情更为简单 将jna jar文件放到上面的文件夹中 然后 确认jna jar和包含文件夹都在CLASSPATH中 接下来 你可以尝试运行HelloWorld类

  如果你感到充满了刺激或者活力 你也许会喜欢尝试着创建你自己的DLL 就像是我们在前面所描述的 只需要按照上面所描述的做 你能做的很好 以防万一 如果你遇到任何问题 你都可以拜访JNA站点

  结论 JNA是如何一步步走来的?

  我很喜欢JNA 它非常的易于使用 如果你的库代码是使用正确的方法编辑的 你就不会遇到很多繁琐的问题 JNA即将成为非常有用的工具来组织处理大量的复杂的工作 关键业务遗留代码 不再有厌烦的JNI标记 并且头文件可以自动生成

  有一点非常重要 与任何新技术相比 是非常容易把人们带进麻烦中的 任何JNA都不例外 因为这个原因 如果JNA有条不紊的使用 它将必定会超越JNI以及那些昂贵的私有的桥接机制 什么样的形式可能会采取这样的规则?JNA资源中的任何调用(比如库代码)将会被充分的记录 提供审查索引 面向方面的技术建议自己使用这种方案 比如说 EJB 拦截装置将会被用于确定JNA代码记录的效果

cha138/Article/program/Java/JSP/201311/19189

相关参考

知识大全 用JNA保护你的传统代码

用JNA保护你的传统代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java本地接入(JNA

知识大全 保护你的代码——谁动了我的组件

  摘要本文描述了如何用CodeAccessSecurity技术来保护代码使代码不致被恶意调用  作为一名NET开发人员你没日没夜地写代码你的组件运行在越来越多的机器上忽然有一天你发现你写的组件被引用

知识大全 JNA调用DLL一点小结

JNA调用DLL一点小结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &n

公司刚刚取得一般纳税人资格,初次运用防伪税控系统开票时,发现系统中的电子发票代码、号码与纸质发票不一致,该怎样处理?

如果发现税务机关填错电子发票代码、号码的,应持纸质专用发票和税控IC卡到税务机关办理退回手续。

知识大全 运用反射给实体赋值

  在系统开发过程中有一些代码是必须反复 写的比如实体的赋值过程(不用实体的免看)  Eg:XXXxxx=XXX  虽然可以通过codesmith来生成赋值但是免不了代码冗长如果是根据数据库

知识大全 使用OracleWrap工具加密你的代码

使用OracleWrap工具加密你的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Orac

知识大全 六大代码问题检验你的Java知识

六大代码问题检验你的Java知识  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  你觉得自己是一个

知识大全 实用PHP代码二十例

实用PHP代码二十例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  PHP可阅读随机字符串  此

知识大全 需代码..

求高手指导~~如何做一个电子商务交易系统,要能用浏览器看到.谢谢啦!需代码..有时间可以处理你的问题我们可以根据你的需求提供一份适用于学生水平的程序为获取帮助,你需要提供有效的电子邮件地址。您可以凭借

知识大全 关于php 接口问题(php接口主要也就是运用curl,curl函数)

本篇文章是对php中的接口问题(php接口主要也就是运用curlcurl函数)进行了详细的分析介绍需要的朋友参考下   接口问题php调用接口最主要的就是使用curl抓取信息复制代码代码如下