JNI:FindClass和未实例化的类

时间:2012-09-26 16:11:31

标签: java-native-interface

只有先前已经实例化过类的实例,FindClass才会成功吗?

如果是这样,实例化一个类的丢弃实例以便后续调用FindClass会成功的最低成本方式是什么?

或者,是否有另一种JNI方法可以与未实例化的类一起使用?

(在我的例子中,我正在尝试查找的类只有静态方法。我希望我的本机代码能够调用这些Java类静态方法之一。)

-Allan

1 个答案:

答案 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执行此操作,所有内容都在堆上动态分配,范围由垃圾收集的引用和调度决定。