2012-02-17 83 views
0

我已經在Java中,下面的代碼:JNI通過引用傳遞失敗

class Foo { 
    public native int bar(String name); 

    public static void main(String[] args) { 
    Foo fo = new Foo(); 
    String n = "Name1"; 
    fo.(n); 
    System.out.println(n); 
    } 
} 

而在CI有:

JNIEXPORT jint JNICALL Java_com_ehsunbehravesh_j7_j7win_windows_Computer_getComputerName 
(JNIEnv *env, jobject obj, jstring name) { 
     name = (*env)->NewStringUTF(env, "Name2"); 
     return 0; 
    } 

我認爲屏幕上的結果應該是Name2但它是Name1

回答

0

字符串是不可變的。爲什麼不直接返回呢?

public native String bar(); 

[..] 

JNIEXPORT jstring JNICALL Java_com_ehsunbehravesh_j7_j7win_windows_Computer_getComputerName 
     (JNIEnv *env, jobject obj) 
{ 
    return (*env)->NewStringUTF(env, "Name2"); 
} 
+0

我需要返回一個int值,我需要遵守庫的標準。所以,如果我使用字符[],而不是它會解決問題? – ehsun7b 2012-02-17 03:31:51

+0

我認爲你將不得不進一步瞭解你想要完成的事情。你能稍微補充一下你的問題嗎? – 2012-02-17 03:33:30

+0

我想要做的唯一事情就是操作C中傳遞的參數,並在Java中訪問新值,因爲我無法使用'return'命令返回值。值的性質類似於String或char []。 – ehsun7b 2012-02-17 03:48:27

0

在C代碼中,name是一個局部變量。改變它不會改變它以前指向的字符串對象。另外,Java String的是不可變的,所以你不能改變對象。你可以做的是將引用返回給一個新的String,因爲你沒有使用整數返回值。

+0

我需要返回一個int值,我需要遵守庫的標準。所以,如果我使用字符[],而不是它會解決問題? – ehsun7b 2012-02-17 03:32:31

+0

你可以使用char []/jcharArray。查看關於數組操作的JNI文檔。請注意,jchar是簡短的,而不是C字符。 – 2012-02-17 14:26:20