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

Posted 函数

篇首语:与天地兮比寿,与日月兮齐光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 运用JNA保护你的遗留代码(一)相关的知识,希望对你有一定的参考价值。

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

  Java Native Access (JNA)承诺为Java和遗留代码之间搭建一座桥梁 为什么这点如此重要?首先 JNA避免了修改遗留代码 即便这些代码的改写要求是存在的

  同时 JNA意味着不再需要昂贵的私有的桥接解决方案 后者包括 神秘的史前工具 就像是代理安排 硬件编码专有协议等等 所有这些解决方案的趋势是很难预测的 易错以及具有潜在的脆弱因素 JNA的另一个关键因素是能够有效的取代Java Native Interface (JNI)

  在这篇文章中 我所要探究的代码类型在这个列表一中将会让读者先睹为快 在列表一中 我引用来自Windows kernel DLL 的GetTickCount()程序 自从系统启动 GetTickCount()返回所经过的毫秒的个数

         public interface CLibrary extends Library

  CLibrary INSTANCE = (CLibrary)

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

  CLibrary class);

  int GetTickCount();

  

  public static void main(String[] args)

  System out println( TickCount + CLibrary INSTANCE GetTickCount());

  

   列表一 简单的JNA实例

  列表一中真正让人感兴趣的是JNI代码不再被需要 取而代之的是一种来自于Java代码的你可以简单的称之为DLL的符号 映射和自动生成JNI头文件或者其他难以填满的材料都是不需要的 取代以上做法的是 伴随着JNA 简单的下载必须的库 标注兴趣符号 然后引用这些符号

  简而言之 JNA解决方案在任何体制下都可以节省费用 从Java径直访问遗留代码的能力可以排除任何使用JNI或者改写遗留代码的需求 也许 JNA最好的承诺就是统一代码环境 无论如何 这里还有其它与JNA有关的话题 这些话题都是关于入侵本机代码环境的 任何一个这样的话题都是围绕Java是否是所谓的系统语言展开的

  Java 不是一种系统语言?

  早期关于Java的一个重要的评论是说Java不是一种系统语言 不像C或者C++ Java生存在JVM内部 并且不能存取低级别的 机器方面的细节问题 允许这些操作的地方 都是需要经过高级别的API JVM中孤立Java的一个关键功能就是保证安全——JVM可能会崩溃 但是它不会致使整个系统瘫痪

  JNA的出现正在潜移默化的改变这些 因为现在Java代码可以存取C风格的结构 列表二显示了Java代码在Windows kernel DLL中通过函数存取数据的另一个例子

         Kernel lib = Kernel INSTANCE;

  SYSTEMTIME time = new SYSTEMTIME();

  lib GetSystemTime(time);

  System out println( Today s integer value is + time wDay);

   列表 kernel dll系统时间

  列表二中 注意到Java代码有权使用低级别的平台数据 JNI意味着Java具有可以存取系统级别数据的能力 无论如何 JNA的另一个重要的应用是遗留代码存取 这些遗留代码中存在大量的有商业价值的信息;举例来说 书写在C/C++中的复杂的数学函数 现在 与其使用JNI 有可能的话还不如直接引用JNA遗留的函数 换句话说 JNA可以被认为是一种桥接技术

  JNA: 桥接技术

  从列表一和列表二的例子中 你可以看到JNA是一种有效的Java—本地—Java桥接技术 这使得JNA与JNI不同 因为这不再有自动生成头文件或者实施特别的C代码的需求 取而代之的是 伴随着JNA你可以简单的标记你想要的库 然后引用它们

  接下来让我们看一个更为完整的例子 实际的创建一个DLL 然后通过JNA代码访问它

  使用JNA的实例

  与其仅仅作为一种单行道的技术使用JNA 简单的访问现有的DLL 还不如标记JNA 访问你自己的DLL 所以我想创建一个真正的简单的DLL 然后通过JNA代码访问 我使用微软的Visual C++ Express Edition——可以从微软网站免费下载 创建一个DLL 你可以使用更多的以前的版本 工作方式将会是一样的

  我不得不说 在一篇Java<的文章中讨论微软的Visual C++无论如何看起来都很奇怪。tW.wiNGwit.列表三就是说明DLL代码的重要性,其大部分都是自动生成的。

         BOOL APIENTRY DllMain( HMODULE hModule,

  DWORD ul_reason_for_call,

  LPVOID lpReserved)

  

  return TRUE;

  

  extern "C" __declspec(dllexport) DWORD helloWorld (DWORD divider)

  

  return 77/divider;

  

   列表三,DLL代码

  不用担心列表三的细节——其中的大部分都是自动生成的。重要的环节是函数调用helloWorld()。这个函数作用不多:传递整数参数,把它划分成不变值77.明显地,这是不提供标准的。后面,我将使用列表三中的代码协议演示一个例外情况,除数为0,让我们看看JNA会发生什么事情。

  让我们快速检查helloWorld()函数的关键点。首先,外部C是用来避免C++的名字装饰的。这意味着函数可以在外表上运行的看起来像是helloWorld(),不需要在名字上面增加任何特殊的特性。接下来,__declspec(dllexport) tag服务于从DLL输出函数。其余的函数定义就是简单的返回值、函数名字和参数。这是其次的代码功能。

  关于创建DLL。这里还有最后一个要点,这需要花费我一些时间——调用约定。确定其设置为__cdecl。在Visual C++ Express Edition中,在C++超前部分中,项目配置水平中设置调用约定。

cha138/Article/program/Java/JSP/201311/19727

相关参考

知识大全 用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接口主要也就是运用curl,curl函数)

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

知识大全 利用DES加密算法保护Java源代码

利用DES加密算法保护Java源代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java语言