最近学习 JNI,先把目前的理解 Note 下来,后面再慢慢修改,如果不对的地方,请指出,3Q
JNI 介绍就不说了,直接进入应用方法,这里说的是 Java 引用 C++ 接口:(目前看到两种)
这里只 Note :从 Java 需要的接口,到 C++ 生成相应的 .so 的过程。
1.这第一种方法最大的特点是:C++的函数名由 Java 的文件编译决定,而且 C++ 文件要引用 Java 生成的 .h 文件。
这种方法在 Windows 和 Linux 中都有看到(因为第二种方法,现在只在 Linux 中看到使用,还没验证 Win32 上的情况),过程为:
生成 .so 的过程:
(1) 先把 Java 需要调用的接口在 .java 文件里写出来。函数使用 native 关键字
如 public native static void set(int i); 后面应用时,Java 程序调用 C++ 的功能就是通过这个接口。
(2) 调用 javac 命令,编译这个文件生成 class, 然后调用 javah 命令,生成 .h 文件。
这个文件里定义了 C++ 中与 .java 中接口 set 对应的函数的函数名,以及参数。如下:
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
(3) 下面要做的就是编写 .cpp 实现 这个 .h 文件中的接口。然后编程生成 .so
2.第二种方法的特点是:实现功能的 C++ 函数名可以任意定义,只要把它与 Java 的接口一一对应就可以,当然这样 Java 也就不需要生成 .h 供 C++ 来应用了(目前这种方法只在 Linux 上看到,Win32 上没验证)。下面就进入过程说明(生成 .so 的过程全在 C++ 中,不要 Java 参与,只需要知道 Java 需要的接口函数就可以了):
(1)当然开始还是要 Java 写出需要的