JNI和它链接到的库

时间:2012-08-22 23:12:26

标签: java-native-interface

我搜索了但没有找到这个“问题”的答案。基本上,通常需要包含jni.h头来访问jni函数,但是头文件主要包含函数原型和结构声明,因此我们要么包含源来解析函数,要么包含静态或动态库(到目前为止找不到)所以链接器可以解析函数原型声明。

到目前为止,我已经使用Android NDK构建了一个本机库,我所做的就是使用jni.h头来使用jni函数,但即使在Oracle的文档和示例中,他们所做的只是包含jni.h头和为编译器指定包含目录,那么编译器如何找到实现?

1 个答案:

答案 0 :(得分:0)

  

编译器如何找到实现?

编译器不必查找实现,JVM会告诉您它们的动态位置:

JNIEnv是结构JNIEnv_的typedef。该结构包含一个名为const struct JNINativeInterface_*的{​​{1}}和许多方法。如果您查看JNI documentation,您会注意到大多数方法都有functions作为第一个参数,但是您使用JNIEnv*调用它们,而不使用env->method(...)参数。文档中的方法是实际的方法,指向它们的指针位于JNIEnv*的{​​{1}}中。 functions中的方法是简单地调用JNIEnv_中的方法指针的包装器。每当JVM创建JNIEnv_和相应的functions时,它就会动态写入所有方法地址。