2012-02-17 80 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