use*_*919 7 c++ java java-native-interface static
开始使用JNI从C++调用静态java方法.具体来说,在获得jclass(使用FindClass)和jmethodID(使用GetStaticMethodID)之后,我继续调用CallStatic*MethodA例程系列.事实证明,所有这些例程都将jclass作为第一个参数.我开始想知道为什么需要类对象:因为所有信息都是在GetStaticMethodID中提供的,所以JVM无需使用类对象来完成工作.然后,我尝试在为第一个参数传递NULL时调用这些例程,并且调用成功.
我的问题:使用NULL类对象调用这些方法是否安全?
激励是:如果它确实合法,我将不必缓存类对象以便后续调用静态方法(同时记住调用NewGlobalRef ....).缓存jmethodID就足够了.
不,用空(或无效)类指针调用此类静态函数绝对不安全。
您的练习可能会非常成功,例如,如果您的静态方法未引用任何其他静态类成员。但是,如果您的静态java方法引用任何其他静态成员,则您的JVM将需要有效的类指针。
例:
观看这个简单的Java演示MyTest.java:
public class MyTest {
public static void mymain() {
System.out.println("Hello, World in java from mymain");
System.out.println(magic_counter); // this will cause a segfault if
} // class pointer is null
private static int magic_counter=777;
}
Run Code Online (Sandbox Code Playgroud)
并使用以下JNI C ++代码段进行调用
... // JVM already loaded and initialised
jclass cls2 = env->FindClass("MyTest");
if(cls2 == nullptr) {
cerr << "ERROR: class not found !";
}
else {
cout << "Class MyTest found" << endl;
jmethodID mid = env->GetStaticMethodID(cls2, "mymain", "()V");
if(mid == nullptr)
cerr << "ERROR: method void mymain() not found !" << endl;
else {
env->CallStaticVoidMethod(cls2, mid);
cout << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
呼叫GetStaticMethodID(nullptr, "mymain", "()V");将失败。因为在mymain()执行时,它将尝试访问静态变量magic_number。然后,JVM将使用您提供的类指针,并假定它是由加载的类返回的有效指针。但由于它为null,因此系统将出现段错误。
| 归档时间: |
|
| 查看次数: |
6103 次 |
| 最近记录: |