Java基础、中级、高级、架构面试资料

Java 源代码安全必会的 javah 命令了解一下!

JAVA herman 2655浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

javah 也是 Java 中的一个命令,全称为 C Header and Stub File Generator。反编译过微信、支付宝的 Android APP 的程序员都知道,这些 APP 都带的有一些 .so 的文件,这些文件都是他们自己实现的一些类库。还有一些级别比较高的程序会自己实现一些本地函数,封装成一个个 DLL 文件,共 Java 调用,从而达到安全的目的。要想让 Java 调用这些对应的 DLL 等文件,就可能要用到 javah 命令。本文我们一起来看一看 javah 的用法。

javah 是用于根据 JAVA 本地方法,生成对应的 c 语言头文件及相应的 stub 文件的命令,使用起来非常简单,我们通过一个 JNI 来说明 javah 的用法吧。

JNI(Java Native Interface)相信大家都熟悉,在 Java 中也普遍的存在。例如 System.arrayCopy 方法:

public static native void arraycopy(Object array1, 
   int start1, Object array2, int start2, int length);

Java 中带有 native 关键字的,基本上都是有本地代码实现。

下面我们来看一个 JNI 的 demo。先使用 native 定义一个 test 方法。

package com.xttblog.test;
public class JNITest {
   /*
    * 建立一个无返回参数的方法,该方法只在DLL方法内打印一条语句。 
    */
   public native void test();
}

使用 Javac 编译该 Java 文件。在 com 文件夹同级目录,执行下面的命令:

javac com/xttblog/test/JNITest.java

然后使用 Javah 生成头文件。命令如下:

javah com.xttblog.test.JNITest

如果命令操作成,就会看到一个 "test_JNITest.h" 的头文件。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test_JNITest */
#ifndef _Included_test_JNITest
#define _Included_test_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test_JNITest
 * Method:    test
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_test_JNITest_test
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

正如文件头部所说,不要对这个生成文件进行任何的修改一样,然后通过 C 实现它。

然后我们将实现后的 C,编译成 DLL,再将 DLL 放到操作系统的 PATH 中,如我是 WINDOWS 中,将其放到 system32 路径下即可,DLL 的名称没有关系。Linux 下可以生成 .so 文件,具体我就不细说了。

建立一个测试类 JNITestCaller。

public class JNITestCaller {
   static {
      // 在系统路径中(如system32)加载名为JNITest.dll文件
      System.loadLibrary("JNITest");
   }
   public static void main(String[] arg) {
      JNITest jniTest = new JNITest();
      jniTest.test();
   }
}

运行 main 方法,或者通过 javac 编译,使用 java 命令运行它(java com.xttblog.test.JNITestCaller),输出对应内容,则表示通过 JNI 调用 DLL 成功且执行成功。否则请自己检查你的执行步骤或代码。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » Java 源代码安全必会的 javah 命令了解一下!