当前位置:网站首页 > Java基础 > 正文

gui基础程序java



0x00 Java部分

首先有一段Java代码,在main函数中引用了会包含native调用的演示函数。至于使用native的具体场景,相信你已经从其他地方了解,此处不在赘述。

 

这段代码有明显的平台倾向,你可以看出笔者用的是Windows平台,从而加载的是DLL动态链接库。如果你正在使用Unix派系的系统,那么动态链接库的后缀应该是*.so。又或者你不想硬编码路径和后缀名,那么可以使用System.loadLibrary函数。

首先静态代码块和静态类Cls会由JVM进行最优先的加载(执行),随后的main方法能够顺利执行。当然这段代码是不能直接运行的,让我们修复缺失的动态链接库部分。

0x01 JNI的一般写法

从Java到本地代码的调用过程可以这样来描述:Java -> JNI Bridge -> Native Code。由此可知我们需要自己编写代码,生成动态运行库。

为了与JNI Bridge能够兼容接入,我们还需要一套标准的声明文件,对于C++这种声明文件就是.h头文件。Java SDK套件下的javah命令就提供了这种自gui基础程序java动生成操作的支持。

java 使用 xuggle_java

图1.javah用法帮助

javah命令支持从已经编译好的class文件中提取出需要实现的native函数接口,然后生成JNI Bridge标准的C++风格.h头文件。

java 使用 xuggle_Test_02

图2.Java代码编译后的目录

编译Java代码后可以得到class文件,可以在资源管理器中查看一下编译后的目录(图2)。按照Java代码的结构,和编译后的路径编写javah构建语句。

 

在src/.https://blog.51cto.com/jni目录下得到dxcyber409_Test_Cls.h文件,有了这个标准声明就可以放心编写C++实现了。

 

java 使用 xuggle_java 使用 xuggle_03

图3.创建Visual Studio项目

此时当然需要创建一个Visual Studio的动态链接库项目,如图3。

此外,细心的你会发现dxcyber409_Test_Cls.h包含了jni.h文件,要想通过编译得把这个文件及其依赖一同包括到项目中(图4)。简单的做法就是把Java SDK套装include目录下的所有.h头文件(由于笔者是在win平台,也包括win32目录下的.h文件),复制一份放到项目源码目录下,并在VS项目中包含这些文件(图5)。

java 使用 xuggle_Test_04

图4.Java SDK套装include目录结构

java 使用 xuggle_Test_05

图5.完成所有.h头文件复制的项目源码目录

在dxcyber409_Test_Cls.h文件中,由于头文件是我们自己在源码目录提供的,而不是使用标准库头文件,因此注意将include <jni> 修改为include "jni.h"。

随后就是实现该头文件,创建一个dxcyber409_Test_Cls.cpp文件后编写一些简单的代码。

 

随后直接编译生成即可,找到生成目录的DLL,移动到D: est.dll路径,DEMO运行成功。

java 使用 xuggle_java_06

图6.DEMO运行结果

PS.如果出现x86架构和x64架构不兼容的提示,在VS中切换架构重新编译即可。

 

java 使用 xuggle_Test_07

0x02 动态注册native函数

javah自动生成的头文件以及函数名称都很冗余繁琐,实际可以使用JNI_OnLoad进行动态的函数注册,就可以免于每次改动都用javah生成新的头文件。

 

首先把目光聚焦于JNI_OnLoad函数。在调用System.load*时JVM会自动对JNI_OnLoad函数进行回调,此处也正是注册和初始化native函数库的最好时机。

在myjni_main.cpp代码中JNI_OnLoad函数的内部调用轨迹为:获取JNIEnv->获取native函数所在类名->调用RegisterNatives函数对gMethods数组所描述的方法映射规则进行注册。

在0x01中我们使用的dxcyber409_Test_Cls.h和dxcyber409_Test_Cls.cpp已经可以抛弃,代码所在的文件名可以任意取。至此JNI内部调用的函数名称和内容已经获得最大程度的自由。编译后得到DLL,放到Java代码可识别的路径中,运行结果一致。

对于这种动态注册的方法,能够避免javah生成的长串类名函数名之外,在攻防安全方面也有许多切入点,而大热的安卓JNI技术也正是基于JVM标准的JNI技术演变而来。

  • 上一篇: java基础369
  • 下一篇: java 基础知识总结
  • 版权声明


    相关文章:

  • java基础3692025-04-06 19:18:03
  • java的基础语法包括2025-04-06 19:18:03
  • java基础6382025-04-06 19:18:03
  • java零基础2025-04-06 19:18:03
  • java awt基础2025-04-06 19:18:03
  • java 基础知识总结2025-04-06 19:18:03
  • java基础语音编程2025-04-06 19:18:03
  • JAVA基础怎么学好2025-04-06 19:18:03
  • java基础昆山2025-04-06 19:18:03
  • 学习java基础入门2025-04-06 19:18:03