gpt4 book ai didi

java - 从 native 代码 (JNI/NDK) 创建、填充和返回二维字符串数组

转载 作者:搜寻专家 更新时间:2023-11-01 04:03:34 26 4
gpt4 key购买 nike

我发现这段代码特别困难(尤其是因为我一周前才开始玩 C)。

我一直在努力寻找正确的语法来在 C 中正确创建 java 字符串数组(即 jstring 对象数组,即表示 jstring 对象数组的对象)。我一直在使用以下资源,并从中构建了可编译的代码。我不确定之后发生的错误是由于语法不正确还是由于完全不同的原因。由于代码大部分是孤立的,我假设语法不正确。

( Suns Native Programming Documentation & 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 跨过 gdb 客户端中的 JNI 代码是行不通的。

最佳答案

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

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

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

关于java - 从 native 代码 (JNI/NDK) 创建、填充和返回二维字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6070679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com