调用 get 或 set 方法会崩溃。对象数组有效。它打印到第 2 行。最初在插入 jobjectArray 时出现错误。还尝试从 Jobject 获取值。getter 和 setter 都失败。
JNI代码如下:
JNIEXPORT jint JNICALL Java_demo_JNIWrapper_pax_1store_1get_1data_1avail_1info
(JNIEnv *env, jclass jclass1, jobjectArray jobj)
{
.....
.....
int len = (*env)->GetArrayLength(env, jobj);
printf ("Incoming object array length = %d\n", len);// - - - > Works.. shows 2 (I am passing 2 objects)
jobject j = (*env)->GetObjectArrayElement(env, jobj,0);
printf("This line 1 \n ");
jmethodID meth1=(*env)->GetMethodID(env,jclass1,"getTimestamp","()Ljava/lang/String;");
printf("This line 2 \n "); // - - - - > Works..
jstring string_from_obj = (*env)->CallObjectMethod(env,j,meth1); // - - - - > Crashes..
printf("This line 3 \n "); // - - -> does not print this..
printf("Contents are =%s\n",(*env)->GetStringUTFChars(env, string_from_obj, 0));
............
}
我的Java对象如下:
public class DataAvailable {
String timestamp;
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
}
对 JNI 的调用如下:
public native int pax_store_get_data_avail_info(DataAvailable[] stats_array);
最佳答案
明显的问题是 pax_store_get_data_avail_info() 不是 DataAvailable 的方法。它是其他类的方法吗?你实际上并没有说它是什么。但我们假设它是:
class X {
public native int pax_store_get_data_avail_info(DataAvailable[] stats_array);
}
当您调用此方法时,您获得的 jclass jclass1
参数适用于“X”,而不是 DataAvailable。因此,您对 GetMethodID() 的调用可能会失败。您不检查返回值,因此您可能会向下一次调用传递错误的方法 ID。 JNI 失败是严重崩溃并且非常难看。
您需要查询 jclass 中的 DataAvailable 并使用它。
关于java - 从 JNI 调用 Java 方法会导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36538322/