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

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 成功且执行成功。否则请自己检查你的执行步骤或代码。

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

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

原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/251990.html

(0)
上一篇 2022年5月3日
下一篇 2022年5月3日

相关推荐

发表回复

登录后才能评论