Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将指向数组的指针从JNIC代码发送到Java代码?_Java_C_Pointers_Java Native Interface - Fatal编程技术网

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

如何将指向数组的指针从JNIC代码发送到Java代码?,java,c,pointers,java-native-interface,Java,C,Pointers,Java Native Interface,如何将指向数组的指针从JNIC代码发送到Java代码?例如: JNIC代码: Java Func: java函数接收指向数组的指针时应该是什么样子?首先,代码有两个问题: arr实际上不是一个数组(它指向一个jvalue),因此没有理由通过指针而不是仅仅通过值来传递它 除了最后一个赋值外,所有那些a1.X赋值都是无用的,因为jvalue是所有可能的原语和引用类型的联合 下一步:不可能将原始C指针传递给JNI(当然,可以,但只能让Java将指针视为数字而不是对象)。您必须创建一个Java数组或缓冲

如何将指向数组的指针从JNIC代码发送到Java代码?例如:

JNIC代码:

Java Func:


java函数接收指向数组的指针时应该是什么样子?

首先,代码有两个问题:

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

    @auselen请在所有有关SO的问题下留下此评论!(这个家庭作业是我想写的某个模块的准备工作)下次试着给出一个更好的答案,这样你就不会得到两张反对票。你为什么使用
    CallVoidMethodA()
    而不是更简单的
    CallVoidMethod()
    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);
    
    public void print(?????) { // what should be the argument here ?
      // add code here
    }