JNI中jstring的对象生命周期是多少?

时间:2011-08-17 07:47:13

标签: java java-native-interface

我对JNI以及JNI环境中的事情处理方式知之甚少。我有一个简单的问题。

我在Java中有一个方法,它调用JNI方法并在参数中传递StringJNI方法接受jstring对象中的该字符串,并将其存储在static vector<jstring>中。

我的问题:在java应用程序的整个生命周期中使用此向量是否安全?我是否需要考虑GC可能在String环境中移动Java的事实?在这种情况下会导致任何问题吗?如果是的话,应该采用什么方式?

2 个答案:

答案 0 :(得分:3)

它可能也可能不行,基本上VM对JNtrings调用之后jstrings使用的内存会发生什么变化的承诺很少

非常直接来自: http://java.sun.com/docs/books/jni/html/objtypes.html

JNI将对象作为不透明引用传递给本机方法。不透明引用是C指针类型,它引用Java虚拟机中的内部数据结构。但是,内部数据结构的确切布局对程序员来说是隐藏的。本机代码必须通过适当的JNI函数来操作底层对象,这些函数可通过JNIEnv接口指针获得。例如,java.lang.String的相应JNI类型是jstring。 jstring引用的确切值与本机代码无关。本机代码调用JNI函数(如GetStringUTFChars(§3.2.1))来访问字符串的内容。

长话短说,你无论如何都不应该直接访问jstring的值,所以没有理由存储jstrings,使用适当的方法将它们转换为本地字符串并以这种方式存储它们。

答案 1 :(得分:0)

  

在java的整个生命周期中使用此向量是否安全   应用

没有。请参阅JNI specification Ch. 2.