Android 如何使用SetArrayRegion将数组从C结构映射到Java类数组?
我想访问C结构(如下)的数据成员,并将它们映射到java类中的数组中。我曾尝试使用SetArrayRegion映射这些值,但我在某个地方出错了。下面是我试图做的一个例子。有人能帮我用正确的语法来映射这些值吗 c标题 `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;
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/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);