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 命令了解一下!
原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/251990.html