JNI维数组:将二维数组从java传递给c

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI维数组:将二维数组从java传递给c相关的知识,希望对你有一定的参考价值。

我正在努力完成以下任务。

  • Java文件请求用户输入两个数字,其中两个数字用于确定二维数组的行数和列数。
  • 这两个数字被传递给本机方法。
  • 在本机方法中,基于从A到Z的随机字符创建阵列的内容。
  • 然后,Native方法将生成的数组传递回Java文件。
  • 然后Java文件显示数组的内容。

我编写了java函数以及一些c代码。但我的问题是如何获得数组的全长,因为它是一个2D数组。使用(*env)->GetArrayLength我只得到行数!但我不知道如何获得列数。

Java的

import java.util.Scanner;

class Array { 
int num1, num2; 
native void DArray(char[][] Arr);

static { System.loadLibrary("CArray");}

public static void main(String args[]) { 
Scanner inp = new Scanner(System.in); 
Array obj = new Array();
System.out.printf("Enter the Number of rows: "); obj.num1 = inp.nextInt();
System.out.printf("Enter the shape <number>: "); obj.num2 = inp.nextInt();
char Arr[][] = new char[obj.num1][obj.num2];
obj.DArray(Arr);
}
}

C代码(JNI)

#include <jni.h> 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

JNIEXPORT void JNICALL Java_Array_DArray (JNIEnv *env, jobject obj, jcharArray arr){

jsize len =(*env)->GetArrayLength(env, arr);

jchar Arr[len];
        for (int i=0;i<len;i++){
        Arr[i] = (rand()%26)+65;
        }       

        for (int i=0;i<len;i++){
            printf("%c""%c",Arr[i],' ');
        }       
return ;
}
答案

首先请理解Java没有二维数组的概念。最佳近似是一维数组的数组,但语言中没有任何内容可以为嵌套数组强制执行相同的长度。

其次我相信你的任务包括在本机代码中创建数组,而不仅仅是用随机内容填充它。

我可能会将两个整数传递给我的本机方法,然后使用JNI函数NewObjectArray和NewCharArray来创建数组数组,并用随机字符填充它。

本机方法会将此数组返回给Java。

印刷已广泛涉及:Java - Best way to print 2D array?

以上是关于JNI维数组:将二维数组从java传递给c的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节数组从android java类传递给JNI C NDK?

JNI内通过参数形式从C/C++中传递string类型数据至Java层

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

Android开发实践:Java层与Jni层的数组传递

将二维数组指针传递给c ++中的函数[重复]

试图将一个连续的动态二维数组从 C 传递到 Fortran