我对JNI
以及JNI
环境中的事情处理方式知之甚少。我有一个简单的问题。
我在Java
中有一个方法,它调用JNI
方法并在参数中传递String
。 JNI
方法接受jstring
对象中的该字符串,并将其存储在static vector<jstring>
中。
我的问题:在java应用程序的整个生命周期中使用此向量是否安全?我是否需要考虑GC
可能在String
环境中移动Java
的事实?在这种情况下会导致任何问题吗?如果是的话,应该采用什么方式?
答案 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.