从本地代码创建、填充和返回2D字符串数组(JNI/NDK)。

 2023-01-20    285  

问题描述

我发现这种特殊的代码非常困难(尤其是因为我一周前才开始玩C).

我一直在努力找到正确的语法,以正确地创建C中的Java字符串数组(即,Jstring对象的数组,即代表Jstring对象数组的对象).我一直在使用以下资源,从中,我构建了编译的代码.我不确定之后发生的错误是由于语法不正确还是由于完全独立的原因.由于代码主要是孤立的,所以我假设语法不正确.

从本地代码创建、填充和返回2D字符串数组(JNI/NDK)。

( suns Native编程文档 ” http://java.sun.com/docs/books/jni/html/objtypes.html#30918″ rel =” nofollow”> suns jni documentation )

)

代码编译,但是在传递” FindClass”行后,发送了SigSeGV信号,该信号杀死了C进程:

jint size = 5;
jclass StringObject = (*env)->FindClass(env, "java/lang/String");
jobjectArray sampleMessage = (*env)->NewObjectArray(env, size, StringObject, NULL);
jobjectArray returnArray = (jobjectArray) (*env)->NewObjectArray(env, messageCount, &sampleMessage, 0);

有人可以将我指向有用的资源吗?或确认语法是正确的.

编辑

我的大部分问题是调试该代码引起了问题.我没有时间缩小繁殖因子的范围,但是通过eclipse逐步介绍JNI代码不起作用.

推荐答案

要获得行类型的JCLASS,您可以在其中一个行上调用GetObjectClass().这有效:

main.java

public class Main {

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

    private static native String[][] getStringArrays();

    public static void main(String[] args) {
        for (String[]  array : getStringArrays())
            for (String s : array)
                System.out.println(s);
    }
}

mynative.c

static jobjectArray make_row(JNIEnv *env, jsize count, const char* elements[])
{
    jclass stringClass = (*env)->FindClass(env, "java/lang/String");
    jobjectArray row = (*env)->NewObjectArray(env, count, stringClass, 0);
    jsize i;

    for (i = 0; i < count; ++i) {
        (*env)->SetObjectArrayElement(env, row, i, (*env)->NewStringUTF(env, elements[i]));
    }
    return row;
}

JNIEXPORT jobjectArray JNICALL Java_Main_getStringArrays(JNIEnv *env, jclass klass)
{
    const jsize NumColumns = 4;
    const jsize NumRows = 2;

    const char* beatles[] = { "John", "Paul", "George", "Ringo" };
    jobjectArray jbeatles = make_row(env, NumColumns, beatles);

    const char* turtles[] = { "Leonardo", "Raphael", "Michaelangelo", "Donatello" };
    jobjectArray jturtles = make_row(env, NumColumns, turtles);

    jobjectArray rows = (*env)->NewObjectArray(env, NumRows, (*env)->GetObjectClass(env, jbeatles), 0);

    (*env)->SetObjectArrayElement(env, rows, 0, jbeatles);
    (*env)->SetObjectArrayElement(env, rows, 1, jturtles);
    return rows;
}

构建,省略了错误处理以清晰.

以上所述是小编给大家介绍的从本地代码创建、填充和返回2D字符串数组(JNI/NDK)。,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25998.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。