如何以定义良好的线程安全方式将C++字符串传递给Java JNI
How to pass a C++ string to Java JNI in a well defined thread-safe way?
有一个C++函数,它是通过JNI从Java代码中调用的
我想把底层的c字符串正确地传递给Java,所以我做了以下安排:
// main.cpp
string global;
const char* data () // Called externally by JNI
{
return (global = func_returning_string()).data(); // `.data()` = `.c_str()`
}
但是在这种情况下,函数data()
不再是线程安全的
在传递字符串时,在不引起任何未定义行为的情况下,实现线程安全的最佳方法是什么?
我想将底层的c字符串正确地传递给Java
您是如何将c++字符串传递给java的?您不能将裸露的C++指针传递给Java,您应该使用JNI函数,即:
jstring jstr = (*env)->NewStringUTF(env, data());
然后将jstr
传递给Java或者以Java数组的形式传递。此函数重复字符串,因此线程安全性没有问题。
如果您想在Java和C++之间共享内存区域,那么您可以尝试使用以下JNI函数:NewDirectByteBuffer
、GetDirectBufferAddress
、GetDirectBufferCapacity
。