2011-05-20 78 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