从JNI调用Java方法会导致程序崩溃

时间:2016-04-11 01:10:43

标签: java c java-native-interface

调用get或set方法崩溃。对象数组有效。它打印到第2行。插入jobjectArray时出现错误。还尝试从Jobject获取值.Bet getter和setter失败。

JNICode如下:

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);

1 个答案:

答案 0 :(得分:1)

明显的问题是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并使用它。