如何将指向JNI C代码的数组指针发送到Java代码?

时间:2012-10-06 05:38:52

标签: java c pointers java-native-interface

如何从JNI C代码向Java代码发送指向数组的指针?例如:

JNI C代码:

jclass cls = (*env)->GetObjectClass(env,obj);
jmethodID mid = (*env)->GetMethodID(env,cls,"print"," ?? "); // What should be the signature here ?
jvalue a1,*arr;
a1.i = 2002;
a1.f = 12.90;
a1.c = 's';
a1.j = 344554;
a1.b = TRUE;
arr = &a1;
(*env)->CallVoidMethodA(env,obj,mid,arr);

Java Func:

public void print(?????) { // what should be the argument here ?
  // add code here
}

java函数应该如何接收指向数组的指针?

1 个答案:

答案 0 :(得分:1)

首先,您的代码有两个问题:

  1. arr实际上不是一个数组(它指向一个jvalue),因此没有理由通过指针而不是仅通过值传递它。
  2. 所有这些a1.X作业都没用,除了最后一项,因为jvalue是所有可能的基元和参考类型的联合
  3. 下一步:将原始C指针传递给JNI是不可能的(好吧,你可以,但你只能让Java将指针看作一个数字而不是一个对象)。您必须创建Java数组或缓冲区对象。如果你要创建一个引用数组,那么数组很好,尽管必须复制内存;如果希望C数组与Java缓冲区共享内存,那么缓冲区就很好。