【问题标题】:JNI Pass Char* 2D array to JAVA CodeJNI 将 Char* 2D 数组传递给 JAVA 代码
【发布时间】:2013-04-12 13:40:12
【问题描述】:

我想从 C 代码通过 JNI 层传递以下指针数组

char *result[MAXTEST][MAXRESPONSE] = {
    { "12", "12", "" },
    { "8",  "3",  "" },
    { "29", "70", "" },
    { "5",  "2",  "" },      
    { "42", "42", "" }
};

在 java 代码中,我编写了以下声明

public static native String[][] getResult();

我很困惑如何将该数组通过 JNI 层传递给 Java 代码???以下是 JNI 层说明

JNIEXPORT jobjectArray JNICALL Java_com_example_CheckResult_getResult
  (JNIEnv *env, jclass thiz) {
Confused over here ????
}

【问题讨论】:

  • 虽然您可以这样做(您实际上必须创建多个 Java 对象,包括数组、作为数组元素的数组和字符串),但我建议您重新-认为您的接口改为返回单个数据块(可能是单个 byte 缓冲区,字符串之间带有 NUL 终止符),并在必要时让 Java 端重新解释它。将 JNI 中的多维 C 数组转换为多维 Java 数组的一般复杂度比在 Java 端构造多维数组要高很多(假设你的 真的 需要那种格式) 来自更简单的数据。

标签: c arrays pointers java-native-interface char


【解决方案1】:

终于在 jop 的共享 link 上工作了几个小时后,我可以解决我的问题了。代码如下:

JNIEXPORT jobjectArray JNICALL Java_com_example_CheckResult_getResult(JNIEnv *env, jclass thiz) {
    jboolean flag = JNI_TRUE;
    jclass stringClass = (*env)->FindClass(env, "java/lang/String");
    jobjectArray row;
    jobjectArray rows;

    jsize i, j;
    for(i=0; i<5; i++) {
        row = (*env)->NewObjectArray(env, MAXRESPONSE, stringClass, 0);
        for(j=0; j<3; j++) {
            (*env)->SetObjectArrayElement(env, row, j, (*env)->NewStringUTF(env, userResponse[i][j]));
        }

        if(flag == JNI_TRUE) {
            flag = JNI_FALSE;
            rows = (*env)->NewObjectArray(env, MAXTEST, (*env)->GetObjectClass(env, row), 0);
        }

        (*env)->SetObjectArrayElement(env, rows, i, row);
    }

    return rows;
}

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2018-04-07
    • 2018-12-02
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2018-02-17
    相关资源
    最近更新 更多