Android 如何使用SetArrayRegion将数组从C结构映射到Java类数组?

Android 如何使用SetArrayRegion将数组从C结构映射到Java类数组?,android,java-native-interface,Android,Java Native Interface,我想访问C结构(如下)的数据成员,并将它们映射到java类中的数组中。我曾尝试使用SetArrayRegion映射这些值,但我在某个地方出错了。下面是我试图做的一个例子。有人能帮我用正确的语法来映射这些值吗 c标题 ` java类 class J { int i_id; long timestamp_ms; long num_states; long[] nls; long[][] lane;

我想访问C结构(如下)的数据成员,并将它们映射到java类中的数组中。我曾尝试使用SetArrayRegion映射这些值,但我在某个地方出错了。下面是我试图做的一个例子。有人能帮我用正确的语法来映射这些值吗

c标题

`


java类

class J {
    int     i_id; 
    long        timestamp_ms; 
    long        num_states;
    long[]      nls;
    long[][]    lane;
    long[]      t;      

    }

test.c

JNIEXPORT jint JNICALL Java_com_android_...
  (JNIEnv *env, jclass c, jobject obj)
{


    bb  c_struct;

    // do some operations on c_struct to populate the structure

    ....


    J   java_class;
    jFieldID fid;
    jclass cls = (*env)->GetObjectClass(env,obj);


    fid=(*env)->GetFieldID(env,cls,"i_id","I");
    (*env)->SetIntField(env,obj,fid,c_struct.id);

    ... similar for timestamp_ms,num_states


    // how do I map c_struct->move_states[i].nls to java_class.nls[i] ??
    // also how do I map c_struct->move_states[i].lane[j] to java_class.lane[i][j]?? 


}`

也许您需要首先分配阵列

这意味着创建长度足够的数组对象NewLongArray(),使用SetLongArrayRegion()填充数组对象,然后使用SetObjectField()将新的数组实例设置为java对象(与旧的实例不同)

通过在Java中确保在调用JNI填充之前分配足够大的数组,您可以快速测试这个理论

int SIZE = 1000;  // make this big enough
J j = new J();
j.nls = new long[SIZE];
j.lane = new long[SIZE][SIZE];  // something like this multi-dimention array
j.t = new long[SIZE];
int i = callMyJniMethod(j);
现在试试你的GetField、SetLongArrayRegion想法。确保num_states小于1000

一旦您证明了这一点并开始工作,您就可以确定您希望API的工作方式了。关于这方面的想法:

  • 保留当前设计,但让JNI分配阵列

  • < L> > p>创建一个新的java对象“aa”,并为每个C++“aa”设置一个JNI,并将其填充,然后将BB(AKJ)数组附加到J对象。j、 aa=新的aa[州数]

FWIW您试图在C++/Java之间复制数据(不是映射,因为术语映射意味着某种共享,更新一个不会更新另一个,除非您重新复制)


FWIW在C/C++中的“long”在您的平台上可能是32位,但在Java中的“long”总是64位。

请给出一个您尝试过的示例,这样我们就可以看出您的错误所在。我尝试了类似这样的方法:“int I=0;对于(i=0;iGetFieldID(env,cls,nls,“[J”);(*env)->setLongarayRegion(env,obj,i,1,c_struct->move_staes[i].nls);}
int SIZE = 1000;  // make this big enough
J j = new J();
j.nls = new long[SIZE];
j.lane = new long[SIZE][SIZE];  // something like this multi-dimention array
j.t = new long[SIZE];
int i = callMyJniMethod(j);