如何以一种定义良好的线程安全方式将C++字符串传递给Java JNI?

iam*_*ind 5 c++ java string java-native-interface thread-safety

有一个C++函数,它通过JNI从Java代码调用.
我想将底层的c-string正确传递给Java,所以我做了以下安排:

// main.cpp
string global;

const char* data ()  // Called externally by JNI
{
  return (global = func_returning_string()).data();  // `.data()` = `.c_str()`
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,该函数data()不再是线程安全的.
在传递字符串时实现线程安全的最佳方法是什么,而不会导致任何未定义的行为?

mar*_*inj 3

我想将底层的c字符串正确传递给Java

你如何将c++字符串传递给java?您不能将裸露的 C++ 指针传递给 Java,您应该为此使用 JNI 函数,即:

jstring jstr = (*env)->NewStringUTF(env, data());
Run Code Online (Sandbox Code Playgroud)

然后传递jstr给Java,或者以Java数组的形式传递。该函数会复制字符串,因此不存在线程安全问题。

如果您想在 Java 和 C++ 之间共享内存区域,那么您可以尝试使用以下 JNI 函数:NewDirectByteBuffer、GetDirectBufferAddress、GetDirectBufferCapacity。