1

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

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

4

1 回答 1

0

编译器如何找到实现?

编译器不必找到实现,JVM 会动态地告诉你它们在哪里:

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

于 2012-09-08T09:38:20.297 回答