【问题标题】:Return multidimensional array in JNI在 JNI 中返回多维数组
【发布时间】:2017-05-09 09:00:18
【问题描述】:

我想将一个已经存在的多维数组从 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;
}

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

【问题讨论】:

  • 也许检查return 2d primitive array的更一般的问题
  • 这个答案令人困惑。我认为它不应该那么复杂和冗长。
  • 但是你试过了吗?不管你喜不喜欢,JNI 往往很冗长,而且所有事情都认为代码没有那么大。
  • @Nafis 您必须通过javah 传递您的Java 代码才能获得本机函数原型。获得函数原型后,您就可以按原样使用这些原型来创建调用。本机代码无法返回int[][] - 它将返回jobjectArray。 Java 中的多维数组是数组的数组——Java 中的数组是一个对象。

标签: java android c++ android-studio java-native-interface


【解决方案1】:
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;
}

【讨论】:

  • 通过做同样的事情我得到JNI DETECTED ERROR IN APPLICATION: attempt to return an instance of int[][] from java.lang.Integer[][]。有什么想法吗?
  • Renauld,在 FindClass 调用“[I” - 这意味着一个 int 数组。如果它是“[java/lang/Integer”,那么它将有一个不同的类型,可以解决这个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多