2011-05-20 42 views
3

我发现这个代码特定位相当困难的二维String数组(不是其中最重要的,因为我只有一个星期前开始使用C玩)。创建,填充并返回从本机代码(JNI/NDK)

我一直试图很难找到正确的语法正确地创建在C的java字符串数组(即,的jstring对象的数组,即其表示的jstring对象的阵列的对象)。我一直在使用以下资源,并从中构建了编译代码。我不确定之后发生的错误是由于语法错误还是由于完全不同的原因。由于代码大多是孤立的,我假设语法不正确。

Suns Native Programming Documentation & Suns JNI documentation

代码编译但传送的代码SIGSEGV信号被发送了“findClass的”线,其杀死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-client中的JNI代码无效。

回答

16

要获得该行类型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; 
} 

大厦误差。

+0

很好的答案。非常感谢你! – Graeme 2011-05-23 10:25:05

+0

这段代码的一个变体在我的测试工具中很好用。然而,当插入到我的应用程序中时,'jclass stringClass =(* env) - > FindClass(env,“java/lang/String”);'会抛出一个'SIGSEGV'。从我所有的检查都框架和应用程序设置相同。不仅如此,我甚至已经使c文件具有足够的通用性,可以在线束和代码之间进行复制,并且仍然会中断。 有谁知道什么'JCLASS stringClass =(* ENV) - > FindClass后面(ENV, “爪哇/郎/字符串”);'是依赖? – Graeme 2011-05-23 14:56:30

+0

大概http://stackoverflow.com/questions/5991615/unable-to-get-jnienv-value-in-arbitrary-context – fizzer 2011-05-23 16:47:03