我搜索了但没有找到这个“问题”的答案。基本上,通常需要包含jni.h头来访问jni函数,但是头文件主要包含函数原型和结构声明,因此我们要么包含源来解析函数,要么包含静态或动态库(到目前为止找不到)所以链接器可以解析函数原型声明。
到目前为止,我已经使用Android NDK构建了一个本机库,我所做的就是使用jni.h头来使用jni函数,但即使在Oracle的文档和示例中,他们所做的只是包含jni.h头和为编译器指定包含目录,那么编译器如何找到实现?
答案 0 :(得分:0)
编译器如何找到实现?
编译器不必查找实现,JVM会告诉您它们的动态位置:
JNIEnv
是结构JNIEnv_
的typedef。该结构包含一个名为const struct JNINativeInterface_*
的{{1}}和许多方法。如果您查看JNI documentation,您会注意到大多数方法都有functions
作为第一个参数,但是您使用JNIEnv*
调用它们,而不使用env->method(...)
参数。文档中的方法是实际的方法,指向它们的指针位于JNIEnv*
的{{1}}中。 functions
中的方法是简单地调用JNIEnv_
中的方法指针的包装器。每当JVM创建JNIEnv_
和相应的functions
时,它就会动态写入所有方法地址。