从本地代码(JNI/NDK)创建,填充和返回2D字符串数组 [英] Create, populate and return 2D String array from native code (JNI/NDK)

查看:70
本文介绍了从本地代码(JNI/NDK)创建,填充和返回2D字符串数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现这部分特殊的代码非常困难(这尤其重要,因为我一周前才开始使用C.)

I'm finding this particular bit of code quite difficult (Not least of which because I only started playing with C a week ago).

我一直在努力寻找正确的语法,以在C中正确创建一个Java字符串数组(即,一个jstring对象的数组,即一个代表jstring对象的数组的对象).我一直在使用以下资源,并根据它们构造了可编译的代码.我不确定此后发生的错误是由于语法不正确还是完全独立的原因引起的.由于代码大多处于隔离状态,因此我假设语法不正确.

I've been trying hard to find the right syntax to correctly create a java string array in C (i.e., an array of jstring objects, i.e. an object which represents an array of jstring objects). I've been using the following resources and from them I've constructed code which compiles. I'm not sure if the error which occurs afterwards is due to the syntax being incorrect or because of a completely separate reason. Since the code is mostly in isolation I'm assuming the syntax is incorrect.

( Suns Native编程文档& Suns JNI文档)

代码可以编译,但是在通过代码的"FindClass"行之后,会发送SIGSEGV信号,这会杀死C进程:

The code compiles but after passing the "FindClass" line of code a SIGSEGV signal is sent which kills the C process:

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);

有人可以为此指出我有用的资源吗?或确认语法正确.

Could anyone point me to a useful resource for this? Or confirm the syntax is correct.

编辑

我的大部分问题是调试此代码导致了问题.我没有时间缩小再现因子,而是通过eclipse在gdb客户端中跳过JNI代码,这是行不通的.

I large part of my problem was that debugging this code caused the problem. I don't have time to narrow down the reproducing factor but stepping over JNI code in a gdb-client through eclipse DOESN'T work.

推荐答案

要获取行类型的jclass,可以在其中一行中调用GetObjectClass().这有效:

To get a jclass for the row type, you can call GetObjectClass() on one of the rows. This works:

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;
}

构建,为清楚起见省略了错误处理.

Building, error handling omitted for clarity.

这篇关于从本地代码(JNI/NDK)创建,填充和返回2D字符串数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆