返回JNI中的多维数组 我想将已经存在的多维数组从C++返回到java代码。我的代码如下: int cells [3][3] = {{0}}; int[][] Java_com_packagename_appname_GameView_addNew( JNIEnv *env, jobject, int row, int col, int val) { cells[row][col] = val; return cells; }

返回JNI中的多维数组 我想将已经存在的多维数组从C++返回到java代码。我的代码如下: int cells [3][3] = {{0}}; int[][] Java_com_packagename_appname_GameView_addNew( JNIEnv *env, jobject, int row, int col, int val) { cells[row][col] = val; return cells; },java,android,c++,android-studio,java-native-interface,Java,Android,C++,Android Studio,Java Native Interface,但很明显,它不起作用。正确的方法是什么?int cells[3][3]={{0}; int cells [3][3] = {{0}}; jobjectArray Java_com_packagename_appname_GameView_addNew( JNIEnv *env, jobject, int row, int col, int val) { cells[row][col] = val; // Get the int array c

但很明显,它不起作用。正确的方法是什么?

int cells[3][3]={{0};
int cells [3][3] = {{0}};

jobjectArray
Java_com_packagename_appname_GameView_addNew(
        JNIEnv *env,
        jobject, int row, int col, int val) {

    cells[row][col] = val;

    // Get the int array class
    jclass cls = env->FindClass("[I");

    jintArray iniVal = env->NewIntArray(3);
    // Create the returnable jobjectArray with an initial value
    jobjectArray outer = env->NewObjectArray(3,cls, iniVal);

    for (int i = 0; i < 3; i++)
    {
        jintArray inner = env->NewIntArray(3);
        env->SetIntArrayRegion(inner, 0, 3, cells[i]);
        // set inner's values
        env->SetObjectArrayElement(outer, i, inner);
        env->DeleteLocalRef(inner);
    }
    return outer;
}
jobjectArray Java_com_packagename_appname_GameView_addNew( JNIEnv*env, jobject,int行,int列,int val){ 单元格[行][col]=val; //获取int数组类 jclass cls=env->FindClass(“[I”); 金泰航空公司iniVal=env->NewIntArray(3); //使用初始值创建可返回的jobjectArray jobjectArray outer=env->NewObjectArray(3,cls,iniVal); 对于(int i=0;i<3;i++) { 金塔瑞内部=环境->纽因塔瑞(3); env->SetIntArrayRegion(内部,0,3,单元格[i]); //设置内部的值 环境->设置对象数组元素(外部、i、内部); env->DeleteLocalRef(内部); } 返回外部; }
int cells[3][3]={{{0};
jobjectArray
Java_com_packagename_appname_GameView_addNew(
JNIEnv*env,
jobject,int行,int列,int val){
单元格[行][col]=val;
//获取int数组类
jclass cls=env->FindClass(“[I”);
金泰航空公司iniVal=env->NewIntArray(3);
//使用初始值创建可返回的jobjectArray
jobjectArray outer=env->NewObjectArray(3,cls,iniVal);
对于(int i=0;i<3;i++)
{
金塔瑞内部=环境->纽因塔瑞(3);
env->SetIntArrayRegion(内部,0,3,单元格[i]);
//设置内部的值
环境->设置对象数组元素(外部、i、内部);
env->DeleteLocalRef(内部);
}
返回外部;
}

也许检查一下这个答案中更一般的问题是令人困惑的。我认为它不应该那么复杂和冗长。但是你试过了吗?不管你喜欢与否,JNI往往是冗长的,所有的事情都认为代码没有那么大。@Nafis你必须通过
javah
来获得本机函数原型。一旦如果你得到了函数原型,你就可以使用这些原型来创建调用。本机代码无法返回
int[]
-它将返回一个
jobjectArray
。Java中的多维数组是数组数组的数组,Java中的数组是对象。可能与这个答案中更一般的问题相同。我认为它不应该那么复杂和冗长。但是你试过了吗?不管你喜欢与否,JNI往往很冗长,所有的事情都认为代码没有那么大。@Nafis您必须通过
javah
传递Java代码才能获得本机函数原型。一旦获得函数原型,您就可以完全按照原型的原样使用这些原型来创建调用。本机代码无法返回
int[]
-它将返回一个
jobjectArray
。Java中的多维数组是数组数组的数组,Java中的数组是对象。通过执行与我在应用程序中得到的
JNI检测到的错误完全相同的操作,可能会重复:尝试从Java.lang.Integer[]返回int[]的实例
。有什么想法吗?Renauld,在FindClass调用“[I”-中,这意味着一个int数组。如果它是“[java/lang/Integer”,那么它将有一个不同的类型,可以解决这个错误。通过做完全相同的事情,我在应用程序中得到了
JNI检测到的错误:尝试从java.lang.Integer[]返回int[]]的实例
。有什么想法吗?Renauld,在FindClass调用“[I”中,这意味着一个int数组。如果它是“[java/lang/Integer”,那么它将具有不同的类型,这可能会解决此错误。