这里先摘录一篇博客里的部分内容:

如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。

上面这段是原作者翻译的,不过感觉有点不太明白:前面说‘一个方法描述符内有native...会被加载到java程序的地址空间‘,然后后面又提到’DLL并未被加载...本地方法被调用之前,DLL才会被加载‘。DLL文件具体是编译的时候加载还是运行的时候加载,这一点还是不能太确定,猜测是运行的时候加载吧---这个有时间再去找找相关资料。
另外,当需要调用反射这样的native api时还会进行安全检查,访问控制等操作,所以性能会相对较低,毕竟编译时做的事被拿到运行时做,所以如果真使用了反射,尽量将一些元数据(比如获取的方法,构造器等)进行缓存。

摘录的文章:
Java的native方法


步履不停
38 声望14 粉丝

好走的都是下坡路