只有先前已经实例化过类的实例,FindClass才会成功吗?
如果是这样,实例化一个类的丢弃实例以便后续调用FindClass会成功的最低成本方式是什么?
或者,是否有另一种JNI方法可以与未实例化的类一起使用?
(在我的例子中,我正在尝试查找的类只有静态方法。我希望我的本机代码能够调用这些Java类静态方法之一。)
-Allan
答案 0 :(得分:1)
只有先前有类的实例,FindClass才会成功 被实例化了吗?
没有。它将找到您的应用程序的类加载器知道的任何类。实例化与否。
只要调用静态方法并使用静态类成员,就不会创建实例。 Java在创建实例时非常懒惰。即使静态初始化程序块的执行时间也早于预期,请参阅get static initialization block to run in a java without loading the class
当您仔细阅读JNI文档时,您会发现CallStatic<type>Method
个系列需要jclass
作为参数,而Call<type>Method
需要jobject
。我认为这种差异解释了所有。
在底部注释:Java中没有“抛弃实例”。您可能会想到在堆栈上创建的C ++样式和作用域实例。无法命令Java执行此操作,所有内容都在堆上动态分配,范围由垃圾收集的引用和调度决定。