2012-08-22 68 views
1

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

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

+0

该文档引用了jvm.lib。 – EJP

回答

0

编译器如何找到实现?

编译器没有找到实现中,JVM会告诉你他们在哪里动态:

JNIEnv对于结构JNIEnv_一个typedef。该结构包含一个名为functionsconst struct JNINativeInterface_*和许多方法。如果您看一下JNI documentation,您会注意到大多数方法的第一个参数是JNIEnv*,但是您可以用env->method(...)来调用它们,而不要使用JNIEnv*参数。文档中的方法是实际的方法,指向它们的指针位于functionsJNIEnv_中。 JNIEnv_中的方法是简单地调用functions中的方法指针的包装。只要JVM创建一个JNIEnv_和相应的JNINativeInterface_,它就会动态地写入所有的方法地址。