只有在先前实例化了该类的实例时,FindClass 才会成功吗?
如果是这样,实例化类的一次性实例以使随后对 FindClass 的调用成功的成本最低的方法是什么?
或者,是否有另一种适用于未实例化类的 JNI 方法?
(在我的例子中,我试图查找的类只有静态方法。我希望我的本机代码能够调用这些 Java 类静态方法之一。)
-艾伦
只有在先前实例化了该类的实例时,FindClass 才会成功吗?
如果是这样,实例化类的一次性实例以使随后对 FindClass 的调用成功的成本最低的方法是什么?
或者,是否有另一种适用于未实例化类的 JNI 方法?
(在我的例子中,我试图查找的类只有静态方法。我希望我的本机代码能够调用这些 Java 类静态方法之一。)
-艾伦
只有在先前实例化了该类的实例时,FindClass 才会成功吗?
不会。它会找到您的应用程序的类加载器知道的任何类。实例化与否。
只要只调用静态方法并使用静态类成员,就不会创建实例。Java 在创建实例方面非常懒惰。甚至静态初始化块的执行时间也比预期的要晚,请参阅获取静态初始化块以在 java 中运行而不加载类
当你仔细阅读 JNI 文档时,你会发现CallStatic<type>Method
familyjclass
作为参数,而Call<type>Method
将jobject
. 我认为这种差异说明了一切。
最重要的是:Java 中没有像“一次性实例”这样的东西。您可能会想到 C++ 风格,在堆栈上创建的作用域实例。不能命令 Java 这样做,所有内容都是在堆上动态分配的,并且范围由垃圾收集的引用计数和调度确定。